我在这里有一些代码:
#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;
}
打印“true”。
根据C ++标准:
十六进制整数文字(十六进制)以0x或0X开头,由一系列十六进制数字组成,包括十进制数字和字母a到f和A到F,十进制值为十到十五。
和
整数文字的类型是表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字节的signed int中,但这并不是真正“代表值”4294967271。
然而:
if (0xFFFFFFE7 == 4294967271) // --> prints "true"
此外:
if (-25 == 0xFFFFFFE7) // --> prints "true"
所以似乎“它的值可以表示”意味着“在二进制级别”,而不是“将十六进制常量视为其等效的十进制数”。听起来不错吗?
在gcc 4.8.2,Ubuntu 14.04,64位处理器上测试。