使用 == 运算符将 char 与 0x80 进行比较总是结果为 false?

2023-12-03

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

为什么在这种情况下条件结果为 false?

Is 0x80在条件中扩展为类似的东西0x80000000?

是否可以使用==操作员检查是否char equals 0x80?


问题是char在 C 和 C++ 标准中,定义它可以是有符号或无符号值,并且char必须至少有 8 位。有问题的架构和编译器似乎使用有符号的 8 位char价值观。

这意味着任何具有最高位(位 7)的值都将为负值。所以 0x80 作为char变为十进制 -128。

常量 0x80 不是一个char值,它是一个int value.

因此,当您将 -128 与 0x80 (128) 进行比较时,它们并不相同,而且永远不可能相同,编译器会计算出这一点并发出警告。

有多种方法可以实现这一目标,以下是一些可能的场景:

首先,我们可以将其中一个值转换为另一个值的类型:

if (((int)byte) & 0xff == 0x80)

or

if (byte == (char)0x80) 

或者,我们可以将常数变为char值,而不是int value.

if (byte == '\200')     // Octal 200 = 0x80. 

or

if (byte == '\x80')

或者,使用unsigned char byte = 0x80;- 指定它是一个无符号字符将确保它不会“翻转为负数”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 == 运算符将 char 与 0x80 进行比较总是结果为 false? 的相关文章

随机推荐