我正在进行整数字节级表示的赋值。我写了一个小程序:
e1.c
int main(void) {
printf("%d\n", -2147483648 < 2147483647);
return 0;
}
当我使用C89标准编译32位版本的可执行文件时,使用命令gcc e1.c -m64 -std=c89 -g -O0 -o e1
,它按预期工作:它打印0
,表明C编译器认为值{ {1}}为2147483648
,因此它将表达式的其余部分转换为unsigned int
。但奇怪的是,这种关系并不适用于打印unsigned int
的64位版本。
任何人都可以解释一下吗?
答案 0 :(得分:10)
整数常量的类型是对应的第一个 可以表示其值的列表。未加十进制的:
int
,long int
,unsigned long int
; [...]
因此,文字2147483648
的类型分别取决于int
,long
和unsigned long
的大小。我们假设int
是32位,就像在许多平台上一样(在您的平台上可能就是这种情况)。
在32位平台上,long
通常为32位。因此,2147483648
的类型为unsigned long
。
在64位平台上,long
通常为64位(尽管某些平台,如MSVC,仍将使用32位用于long
)。因此,2147483648
的类型为long
。
这导致您看到的差异。在一种情况下,你否定unsigned long
,而在另一种情况下,你否定了long
。
在32位平台上,-2147483648
评估为2147483648
(使用unsigned long
类型)。因此,得到的比较结果为2147483648 < 2147483647
,其评估结果为0
。
在64位平台上,-2147483648
评估为-2147483648
(使用long
类型)。因此,得到的比较结果为-2147483648 < 2147483647
,其评估结果为1
。