使用==运算符将char与0x80进行比较总是会导致错误?

时间:2013-07-24 20:54:00

标签: c++ types binary char byte

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的结果?

0x80是否会在条件中扩展为0x80000000

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

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:0)

signed char类型可以包含值0x7f-0x80,总共256个值。 unsigned char类型可以包含值0x80,因为最大值为0xff。您使用的char类型的实施似乎是signed char类型。

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

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