#include <stdio.h>
int main(void)
{
printf("%d", sizeof(signed int) > -1);
return 0;
}
结果为0(FALSE)。 怎么会这样? 我使用的是64位ubuntu linux,结果应该是(4> -1)=&gt; 1 =&gt;真。
答案 0 :(得分:10)
事情是sizeof
运算符返回无符号数量(size_t
)。因此,比较将-1
提升为无符号,这使得它看起来非常大。
您可以尝试:
printf("%d", ((int)sizeof(signed int)) > -1);
答案 1 :(得分:8)
sizeof(signed int)
的类型为size_t
,这是一种无符号类型。当您在有符号值和无符号值之间进行比较[并且无符号值的类型至少与有符号值的类型一样大]时,在比较之前将有符号值转换为无符号值。此转换会导致-1
成为无符号类型的最大可能值。换句话说,就好像你写了
#include <limits.h>
/* ... */
printf("%d", sizeof(signed int) > SIZE_MAX);
当你犯这个错误时,你可以让gcc警告,但是默认情况下它甚至不在-Wall
中:你需要-Wextra
或更具体地-Wsign-compare
。 (此警告可以产生大量误报,但我认为打开新代码很有用。)
答案 2 :(得分:5)
C中有许多隐式转换,它有助于理解所谓的“通常的算术转换”,,其中包含所谓的整数促销。 1
实际规则有点复杂,但是,简化后,当运算符具有不同类型的操作数时,所有标量类型都会自动转换。转换首先采用较低等级的操作数并将其转换为较高等级的类型。然后,如果只有一个操作数被签名,则它将被转换为无符号,除非带有有符号类型的操作数更大并且可以表示所有无符号类型的值。你的例子不是这种情况,因为size_t几乎总是大于或大于int。
最后,在几乎所有机器上,-1都设置了所有位,使其成为无符号时非常大的数字。
1。 ISO / IEC 9899:1999 (“C99”) 6.3转换