#include <stdio.h>
int main(void)
{
if (sizeof(int) > -1)
printf("True");
else
printf("False");
}
Run Code Online (Sandbox Code Playgroud)
它打印False.为什么sizeof()不返回值if?
小智 24
无符号和有符号整数提升(更确切地说,是"通常的算术转换").sizeof产生一个类型的值size_t,当与无符号值(即size_t)相比时,-1被提升为该类型,并且溢出并变得巨大.
无符号整数溢出具有明确定义的行为,并且将被视为模2 ^ width,其中width是特定无符号整数类型中的位数.所以,如果你有一个32位宽size_t并且int,例如,你的比较将相当于用
if (4 > 4294967295u)
Run Code Online (Sandbox Code Playgroud)
这显然是假的.
Lun*_*din 12
sizeof(int)和-1.sizeof(int)是类型size_t,保证是无符号整数.在实践中,size_t很可能至少与unsigned int那里的任何系统一样大.-1是类型int,相当于signed int.这些状态(C11 6.3.1.8):
...
否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数类型的操作数的类型.
否则,两个操作数都转换为无符号整数类型,对应于带有符号整数类型的操作数的类型.
int不能适合a的所有值size_t.-1转换为无符号整数.实际上,size_t很可能等同于unsigned int或unsigned long.在这样的变量中存储-1时发生的是实现定义的行为.0xFFFFFFFF(FF的数量取决于给定系统上int的大小).4 > 0xFFFFFFFF 评估为假.