char byte = 0x80
if(byte == 0x80)
{
cout << "This message never gets printed!";
}
十六进制值 0x80
在二进制中等价于 1000 0000
,显然适合一个字节。
但是,编译器会警告我有关带有条件的行:
warning: comparison is always false due to limited range of data type
为什么在这种情况下条件的结果为假?
0x80
是否在条件条件下扩展为类似 0x80000000
的内容?
是否可以使用 ==
运算符来检查 char
是否等于 0x80
?
最佳答案
问题是 char
在 C 和 C++ 标准中定义它可以是有符号或无符号值,并且 char
必须具有至少 8 位。所讨论的体系结构和编译器似乎使用带符号的 8 位 char
值。
这意味着任何具有最高位(第 7 位)的值都将是负值。所以 0x80 作为 char
变成 -128 十进制。
常量 0x80 不是 char
值,它是 int
值。
因此,当您将 -128 与 0x80 (128) 进行比较时,它们并不相同,而且永远不可能相同,编译器会发现这一点并发出警告。
有多种方法可以实现这一点,以下是几种可能的情况:
首先,我们可以将其中一个值转换为另一个值的类型:
if (((int)byte) & 0xff == 0x80)
或
if (byte == (char)0x80)
或者,我们可以将常量变成char
值,而不是int
值。
if (byte == '\200') // Octal 200 = 0x80.
或
if (byte == '\x80')
或者,使用 unsigned char byte = 0x80;
- 指定它是一个 unsigned char 将确保它不会“翻转为负数”。
关于c++ - 使用 == 运算符将 char 与 0x80 进行比较总是会导致 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17844622/