整数推广 – 步骤是什么

此代码打印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可能会被包围。 如果他们被提升为未签约的短裤,那么可能会被包围。

所以它就像是说if( (int) a == (int) b ) 。 并且a = -5,所以(int)a = -5,并且b = 65531,因此(int)b = 65531,因为int大于short。

 a == b 

在上面的表达式中, ab都被提升为int

 unsigned short b=-5u; 

在此声明中,通过整数转换(此处适用-5U )将-5U转换为unsigned short ,并变为大值。

(C99,6.3.1.3p2)“否则,如果新类型是无符号的,则通过重复加或减一个可以在新类型中表示的最大值来转换该值,直到该值在该范围内。新型。”

然后b值是(unsigned short) ((unsigned int) USHRT_MAX + 1 -5)如果USHRT_MAX(unsigned short) 65535 ,则是(unsigned short) 65531

所以你拥有的是:

(short) -5 == (unsigned short) 65531

这两个操作数的整数提升后相当于:

-5 == 65531

相当于0

short to unsigned short是转换(因此具有转换级别)

shortint是促销(因此具有晋升级别)

由于排名,促销优先于转化。 促销在算术和其他操作期间发生。 仅在将一个整体类型存储在另一个内部时发生转换。 算术运算可以导致转换和促销,以便将类型强制在一起。 再举一个例子:

 unsigned int u = 2; int i = 2; u + i; 

i被转换(未晋升)为unsigned

您的值将转换为更大的值,因为它由于unsigned而回绕。 然后,他们被提升为int 。 因此a != b就是这样。