整数推广 - 步骤是什么

Joh*_*ing 8 c c++ integer-promotion

此代码打印B2

short a=-5;
unsigned short b=-5u;
if(a==b)
    printf("A1");
else
    printf("B2");
Run Code Online (Sandbox Code Playgroud)

我读到了有关整数提升的内容,但我现在还不清楚,这里的示例是如何工作的?有人可以彻底发布编译器在扩大/截断值时遵循的步骤吗?

Dav*_*ave 9

让我们来看看你的代码:

short a = -5;
Run Code Online (Sandbox Code Playgroud)

a = -5,适合短.到目前为止这么容易.

unsigned short b = -5u;
Run Code Online (Sandbox Code Playgroud)

-5u表示将一元运算-符应用于常数5u.5u是(unsigned int)5,并且一元-没有促销,所以最终得到4294967291,这是2 ^ 32-5.(更新:我的原始答案中有点错误;请参阅一个测试脚本,其中显示此版本是正确的http://codepad.org/hjooaQFW)

现在当把它放在b中时,它被截断为无符号短(通常为2个字节),因此b = 65531,即2 ^ 16-5.

if( a == b )
Run Code Online (Sandbox Code Playgroud)

在这一行中,a和b都被提升为整数,以便比较可以正确进行.如果他们被提升为短裤,b可能会被包围.如果他们被提升为未签约的短裤,那么可能会被包围.

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

  • 嗯,`-5u`是完全明智的.它将`-`应用于整数常量`5u`. (3认同)