3 回答
TA贡献1951条经验 获得超3个赞
sizeof
它不是一个功能,它是一个操作员。括号不是运算符名称的一部分。它失败了,因为生成的值具有无符号类型
size_t
,这导致“通常的算术转换”-1
转换为无符号,在这种情况下,它是一个非常大的数字。
基本上你正在比较4 > 0xffffffffu
,或者至少接近它。有关详情,请参阅此问题。
TA贡献1848条经验 获得超6个赞
if语句中>运算符的操作数是
sizeof(int)
和-1
。sizeof(int)
是类型size_t
,保证是无符号整数。在实践中,size_t
很可能至少与unsigned int
那里的任何系统一样大。-1
是类型int
,相当于signed int
。不会发生整数提升,因为两个操作数都是足够大的整数类型。
然后根据正式称为通常算术转换的C规则平衡两个操作数。
这些状态(C11 6.3.1.8):
...
否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数类型的操作数的类型。
否则,两个操作数都转换为无符号整数类型,对应于带有符号整数类型的操作数的类型。
上面的后者将会发生,因为(签名)
int
不能适合a的所有值size_t
。因此
-1
转换为无符号整数。实际上,size_t
很可能等同于unsigned int或unsigned long。在这样的变量中存储-1时发生的是实现定义的行为。在二进制补码计算机上(世界上所有计算机的99.9%),-1将被解释为
0xFFFFFFFF
(FF的数量取决于给定系统上int的大小)。4 > 0xFFFFFFFF
评估为假。
- 3 回答
- 0 关注
- 578 浏览
添加回答
举报