为什么会这样
unsigned char k=-1
if(k==-1)
is false
unsigned int k=-1
if(k==-1)
is true
为了演示的目的,我们假设 8 位char
s 和 32 位int
s.
unsigned char k=-1;
k
被赋值为255。
if(k==-1)
的左侧==
运算符是一个unsigned char
。右侧是一个int
。由于 a 的所有可能值unsigned char
可以安装在一个int
,左侧被转换为int
(这是由于整数提升而执行的,如下引用)。比较结果是这样的(255 == -1)
,这是错误的。
unsigned int k=-1
k
被赋值为 4294967295
if(k==-1)
这次,左侧(无符号整数)无法放入 int 中。标准规定,在这种情况下,两个值都会转换为无符号整数。所以这导致了比较(4294967295 == 4294967295)
,这是事实。
标准中的相关引用:
整数提升:(C99,6.3.1.1p2)
如果一个int可以表示原始类型的所有值,则将该值转换为int;否则,它被转换为无符号整型。
常用算术转换:(6.3.1.8)。
[对于整型操作数,] 对两个操作数都执行整数提升。然后将以下规则应用于提升的操作数:
- 如果两个操作数具有相同的类型,则不需要进一步转换。
...
- 否则,如果具有无符号整数类型的操作数的等级更大或
等于另一个操作数的类型的等级,然后操作数
有符号整数类型转换为无符号操作数类型
整数类型。
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)