4
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

是否可以使用==运算符来检查 a 是否char等于0x80

4

2 回答 2

9

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

这意味着任何具有最高位(位 7)的值都是负值。所以 0x80 作为 achar变为 -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 将确保它不会“翻转为负数”。

于 2013-07-24T22:25:49.603 回答
0

signed char类型可以包含总共 256 个值的值0x7f-0x80unsigned char类型可以包含该值0x80,因为最大值是0xffchar您正在使用的类型的实现似乎是一种signed char类型。

分配0x80给 a 会signed char强制值溢出,使值成为-0x80。该signed char类型无法0x80向系统表示,因为它始终被解释为-0x80。这是因为最高有效位用作符号位。

如果您使用按位和:您的比较可能会成功byte & 0x80。请注意,此操作的结果并不意味着在任一方向上都相等,而只是是否设置了最高有效位。

于 2013-07-24T20:55:51.040 回答