[英]sizeof() operator in if-statement
#include <stdio.h>
int main(void)
{
if (sizeof(int) > -1)
printf("True");
else
printf("False");
}
它打印False
。 为什么 sizeof() 不在if
返回值?
无符号和有符号整数提升(更准确地说,是“通常的算术转换”)。 sizeof
产生一个size_t
类型的值,当与一个无符号值( size_t
是)相比时,-1 被提升为该类型,并溢出并变得巨大。
无符号整数溢出具有明确定义的行为,并被视为模2 ^ width
,其中width
是特定无符号整数类型中的位数。 因此,例如,如果您有一个 32 位宽的size_t
和int
,则您的比较将等同于
if (4 > 4294967295u)
这显然是错误的。
sizeof(int)
和-1
。sizeof(int)
是size_t
类型,它保证是一个无符号整数。 实际上,在任何系统上, size_t
很可能至少与unsigned int
一样大。-1
是int
类型,它等价于signed int
。这些状态(C11 6.3.1.8):
...
否则,如果有符号整数类型操作数的类型可以表示无符号整数类型操作数类型的所有值,则将无符号整数类型操作数转换为有符号整数类型操作数的类型。
否则,两个操作数都被转换为与带符号整数类型的操作数的类型对应的无符号整数类型。
int
不能适合size_t
所有值。-1
被转换为无符号整数。 实际上, size_t
很可能相当于 unsigned int 或 unsigned long。 在这样的变量中存储 -1 时发生的任何事情都是实现定义的行为。0xFFFFFFFF
(FF 的数量取决于给定系统上 int 的大小)。4 > 0xFFFFFFFF
评估为假。 Sizeof 是一个运算符,它产生一个 unsigned long int。 因此,当您将 unsigned long int 与 -1 进行比较时,它存储为0xffffffff
(int 的大小为 4 个字节)。
-1 默认是有符号整数。 但是,在有符号整型和无符号整型之间进行比较时,编译器将有符号整型隐式转换为无符号整型。 这导致无符号 -1 大约等于 4.6giga 值。
因此,输出为false
。
只需测试一下,自己看看
#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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.