Cor*_*ein 3 c++ binary byte types char
char byte = 0x80
if(byte == 0x80)
{
cout << "This message never gets printed!";
}
Run Code Online (Sandbox Code Playgroud)
十六进制值0x80
在二进制中是等效的1000 0000
,它明显适合一个字节.
但是,编译器警告我有条件的行:
warning: comparison is always false due to limited range of data type
Run Code Online (Sandbox Code Playgroud)
在这种情况下,为什么条件为false的结果?
是否0x80
有条件的扩展0x80000000
?
是否可以使用==
运算符检查是否char
等于0x80
?
问题是char
,在C和C++标准中,定义它可以是有符号值或无符号值,并且a char
必须至少有8位.有问题的体系结构和编译器似乎使用带符号的8位char
值.
这意味着具有最高位(位7)的任何值都将为负值.所以0x80 char
变为-128十进制.
常量0x80不是char
值,它是一个int
值.
因此,当你将-128与0x80(128)进行比较时,它们就不一样了,而且永远不会,并且编译器会想出这个并发出警告.
有多种方法可以实现这一点,以下是一些可能的情况:
首先,我们可以将任一值转换为另一个的类型:
if (((int)byte) & 0xff == 0x80)
Run Code Online (Sandbox Code Playgroud)
要么
if (byte == (char)0x80)
Run Code Online (Sandbox Code Playgroud)
或者,我们可以将常量变为char
值,而不是int
值.
if (byte == '\200') // Octal 200 = 0x80.
Run Code Online (Sandbox Code Playgroud)
要么
if (byte == '\x80')
Run Code Online (Sandbox Code Playgroud)
或者,使用unsigned char byte = 0x80;
- 指定它是unsigned char将确保它不会"翻转为负".
归档时间: |
|
查看次数: |
3065 次 |
最近记录: |