在下面的代码中,sizeof(int)
将产生一个值为4个字节的signed int
(假设在一个特定的编译器上),而-1
也是signed int
,那么我的答案应该是Yes但它显示No.
#include <stdio.h>
int main()
{
if (sizeof(int) > -1)
printf("Yes");
else
printf("No");
return 0;
}
那是着名的签名无符号比较。这里-1
与无符号数字相比是有符号数字 - 提升为无符号数,导致大幅度值(SIZE_MAX
)。所以它总是错误的。
解释为什么在比较时会出现类型提升的原因:
从标准§6.3.1.8
否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。
也来自§6.5.8关系运营商
如果两个操作数都具有算术类型,则执行通常的算术转换。
什么尺寸的回报?
在sizeof和_Alignof运算符下§6.5.3.4
两个运算符的结果的值是实现定义的,其类型(无符号整数类型)是size_t,在(和其他头文件)中定义。
在常见定义下的§7.19部分
size_t是sizeof运算符的结果的无符号整数类型;
当你将-1
转换为size_t
时,为了进一步澄清,它将具有该值(基本上模数SIZE_MAX+1
)
SIZE_MAX+1+(-1)
也来自标准的§6.2.5(解释转换)
涉及无符号操作数的计算永远不会溢出,因为无法通过生成的无符号整数类型表示的结果将以比结果类型可以表示的最大值大1的数量为模。