我这里有一些代码:
#include <stdio.h>
int main ()
{
char foo = 0xE7;
if (foo == 0xE7)
printf ("true\n");
else
printf ("false\n");
return 0;
}
打印“假”。我不太担心,因为我可以相信 foo 包含 0xE7,它现在被认为是有符号的 (-25) 并将 false 与 0xE7 进行比较——十进制为 231。
但是这个呢?
#include <stdio.h>
int main ()
{
char c = 0xE7;
if (c == 0xFFFFFFE7)
printf ("true\n");
else
printf ("false\n");
return 0;
}
那打印“真实”。
根据 C++ 标准:
十六进制整数文字(以 16 为基数)以 0x 或 0X 开头,由一系列十六进制数字组成,其中包括十进制数字和字母 a 到 f 和 A 到 F,十进制值到 15。
和:
整数文字的类型是表 6 中可以表示其值的相应列表中的第一个。
列表中的第一项是“int”。由于比较是正确的,因此看起来 0xFFFFFFE7 == -25。
但是,0xFFFFFFE7 是 4294967271 的另一种写法。所以我们试试:
#include <stdio.h>
int main ()
{
char c = 0xE7;
if (c == 4294967271)
printf ("true\n");
else
printf ("false\n");
return 0;
}
打印“假”。因此,0xFFFFFFE7 与 4294967271 不同。
回到标准,“可以表示其价值”这句话的真正含义是什么?显然,您可以将 0xFFFFFFE7 填充到 4 字节有符号整数中,但这并不是真正“代表值”4294967271。
然而:
if (0xFFFFFFE7 == 4294967271) // --> prints "true"
还:
if (-25 == 0xFFFFFFE7) // --> prints "true"
所以看起来“它的值可以表示”意味着“在二进制级别”,而不是“将十六进制常量视为其等效的十进制数”。这听起来对吗?
在 gcc 4.8.2、Ubuntu 14.04、64 位处理器上测试。