#include <stdio.h>
int main(void)
{
if (sizeof(int) > -1)
printf("True");
else
printf("False");
}
打印False
。为什么sizeof()不返回if
中的值?
答案 0 :(得分:54)
sizeof
不是函数,它是一个运算符。括号不是运营商名称的一部分。size_t
,这导致“通常的算术转换”,其中-1
被转换为无符号,在这种情况下,它是一个非常大的数字。基本上你比较4 > 0xffffffffu
,或者至少接近它的东西。 See this question了解详情。
答案 1 :(得分:24)
无符号和有符号整数提升(更确切地说,是“通常的算术转换”)。 sizeof
生成类型为size_t
的值,当与无符号值(size_t
为)进行比较时,-1将提升为该类型,并溢出并变为巨大。 强>
无符号整数溢出具有明确定义的行为,并且将被视为模2 ^ width
,其中width
是特定无符号整数类型中的位数。因此,如果你有一个32位宽的size_t
和int
,那么你的比较将等同于
if (4 > 4294967295u)
这显然是假的。
答案 2 :(得分:12)
sizeof(int)
和-1
。sizeof(int)
的类型为size_t
,保证为无符号整数。在实践中,size_t
很可能至少与任何系统上的unsigned int
一样大。-1
的类型为int
,相当于signed int
。这些状态(C11 6.3.1.8):
...
否则,如果带有符号整数类型的操作数的类型可以 表示带有unsigned的操作数类型的所有值 整数类型,然后转换具有无符号整数类型的操作数 到带有符号整数类型的操作数的类型。
否则,两者兼而有之 操作数转换为对应的无符号整数类型 带有符号整数类型的操作数的类型。
int
无法适合size_t
的所有值。-1
被转换为无符号整数。实际上,size_t
很可能等同于unsigned int或unsigned long。无论在这样的变量中存储-1是什么,都是实现定义的行为。0xFFFFFFFF
(FF的数量取决于给定系统上int的大小)。4 > 0xFFFFFFFF
评估为false。答案 3 :(得分:2)
Sizeof是一个导致unsigned long int的运算符。因此,当您将unsigned long int与-1进行比较时,将其存储为0xffffffff
(int的大小为4个字节)。
-1是有符号整数。但是,在signed int和unsigned int之间进行比较时,编译器会将signed int的隐式类型转换为unsigned int。这导致无符号-1大约等于4.6giga值。
因此,输出为false
。
答案 4 :(得分:1)
试试这个并亲自看看
#include <stdio.h>
main() {
unsigned int a=4;
int b = -1;
//this is what you're doing
printf("%u vs %u\n", a, (unsigned int)b);
//this is what you want to do instead
printf("%d vs %d\n", (int)a, b);
}