此代码打印 B2
short a=-5;
unsigned short b=-5u;
if(a==b)
printf("A1");
else
printf("B2");
我阅读了有关整数提升的信息,但我仍然不清楚,它在此处的示例中是如何工作的?有人可以彻底发布编译器在扩大/截断值时遵循的步骤吗?
此代码打印 B2
short a=-5;
unsigned short b=-5u;
if(a==b)
printf("A1");
else
printf("B2");
我阅读了有关整数提升的信息,但我仍然不清楚,它在此处的示例中是如何工作的?有人可以彻底发布编译器在扩大/截断值时遵循的步骤吗?
让我们来看看你的代码:
short a = -5;
a = -5,适合短。到目前为止很容易。
unsigned short b = -5u;
-5u 表示将一元运算-
符应用于常数 5u。5u 是 (unsigned int) 5,并且一元-
没有提升,所以你最终得到 4294967291,即 2^32-5。(更新:我的原始答案有点错误;在此处查看显示此版本正确的测试脚本http://codepad.org/hjooaQFW)
现在将其放入 b 时,它会被截断为无符号短整数(通常为 2 个字节),因此 b = 65531,即 2^16-5。
if( a == b )
在这一行中,a 和 b 都被提升为整数,以便可以正确进行比较。如果他们被提升为短裤,b 可能会环绕。如果他们被提升为未签名的短裤,a 可能会卷入。
所以这就像说if( (int) a == (int) b )
。并且 a = -5,所以 (int) a = -5,并且 b = 65531,所以 (int) b = 65531,因为 int 比短裤大。
a == b
a
并且在上面的表达式b
中都被提升为。int
unsigned short b=-5u;
在此声明-5U
中unsigned short
通过整数转换的方式转换为(C99, 6.3.1.3p2 在此适用)并成为一个大值。
(C99, 6.3.1.3p2) "否则,如果新类型是无符号的,则在新类型中可以表示的最大值的基础上反复加减一,直到该值在新型。”
b
值是 then(unsigned short) ((unsigned int) USHRT_MAX + 1 -5)
即(unsigned short) 65531
if USHRT_MAX
is (unsigned short) 65535
。
所以你有的是:
(short) -5 == (unsigned short) 65531
这在两个操作数的整数提升后等效于:
-5 == 65531
这相当于0
。
short
tounsigned short
是转换(因此具有转换等级)
short
toint
是一个提升(因此具有提升等级)
由于排名,促销优先于转化。提升发生在算术和其他操作期间。当仅将一个整数类型存储在另一个整数类型中时,就会发生转换。算术运算可以导致转换和提升,以便将类型强制在一起。再举一个例子:
unsigned int u = 2;
int i = 2;
u + i;
i
被转换(未提升)为unsigned
.
您的值将转换为更大的值,因为它是unsigned
. 然后,他们被提升为int
。也正因如此a != b
。