在下面的代码中,sizeof(int)
将生成signed int
,其值为4个字节(假设在特定编译器上),-1
也是signed int
,那么我的答案应为是,但会显示否。
#include <stdio.h>
int main()
{
if (sizeof(int) > -1)
printf("Yes");
else
printf("No");
return 0;
}
答案 0 :(得分:6)
这是着名的签名无符号比较。这里-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(解释转换)
涉及无符号操作数的计算永远不会溢出,因为 无法用结果无符号整数表示的结果 type是以大于最大值的数量减少的模数 可以由结果类型表示的值。