整数推广 - 步骤是什么

时间:2013-03-06 19:05:27

标签: c++ c integer-promotion

此代码打印B2

short a=-5;
unsigned short b=-5u;
if(a==b)
    printf("A1");
else
    printf("B2");

我读过关于整数提升的内容,但我仍然不清楚,这个例子在这里有什么作用?有人可以在扩大/截断值时彻底发布编译器遵循的步骤吗?

3 个答案:

答案 0 :(得分:9)

让我们来看看你的代码:

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,因为整数大于短路。

答案 1 :(得分:3)

a == b
上述表达式中

ab都被提升为int

unsigned short b=-5u;

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

  

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

如果b(unsigned short) ((unsigned int) USHRT_MAX + 1 -5),则

(unsigned short) 65531值为USHRT_MAX(unsigned short) 65535

所以你拥有的是:

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

在将两个操作数整数提升为:

之后相等

-5 == 65531

相当于0

答案 2 :(得分:1)

shortunsigned short是转化(因此具有转化排名)

shortint是促销(因此具有促销排名)

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

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

i已转换(不提升)为unsigned

您的值会转换为更大的值,因为它是由unsigned包围的。然后,他们被提升为int。因此a != b就是这样。