今天,我正在从开关块中得到一些奇怪的行为,特别是我正在从文件中读取一个字节,并将它与某些十六进制值(文本文件编码问题,没什么大不了)进行比较。代码看起来像这样:什么发生在整数类型转换的无符号字符的背景?
char BOM[3] = {0};
b_error = ReadFile (iNCfile, BOM, 3, &lpNumberOfBytesRead, NULL);
switch (BOM[0]) {
case 0xef: {
// Byte Order Marker Potentially Indicates UTF-8
if ((BOM[1] == 0xBB) && (BOM[2] == 0xBF)) {
iNCfileEncoding = UTF8;
}
break;
}
}
哪些没有工作,虽然调试看起来不错。我意识到交换机正在将值提升为整数,一旦点击就可以在case语句中使用0xffffffef进行匹配。当然,正确的解决方案是使BOM []无符号,现在一切都按照预期进行促进和比较。
有人可以简单地解释产生0xffffffef而不是0x000000ef的char - > int提升中发生了什么吗?
无论是'char'工程作为'签署char'或'无符号char'是实现定义(这意味着该标准不会告诉你,但你的编译器的文档应该) 。正如你已经注意到的,如果你需要特别签名或未签名的角色,你需要指定你自己。 – 2011-06-06 20:50:10
我现在非常清楚地看到,我被锁定在思考“无符号”的状态......即使当我意识到声明这样的解决方案时,我从来没有停下来认为239的字节值在签名变量中为负数。咄。感谢大家的意见。 – Stephen 2011-06-07 12:43:04