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; - 指定它是一个无符号字符将确保它不会“翻转为负数”。

关于c++ - 使用 == 运算符将字符与 0x80 进行比较总是会导致错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17844622/

10-12 20:35