C++ 整数提升-步骤是什么

C++ 整数提升-步骤是什么,c++,c,integer-promotion,C++,C,Integer Promotion,此代码打印B2 short a=-5; unsigned short b=-5u; if(a==b) printf("A1"); else printf("B2"); 我读过integer升级,但我仍然不清楚,在这里的示例中它是如何工作的?有人能完整地发布编译器在加宽/截断值时遵循的步骤吗 a == b 在上述表达式中,a和b都提升为int unsigned short b=-5u; 在此声明中,-5U通过整数转换(C99,6.3.1.3p2在此适用)转换为无符号短,并成为

此代码打印B2

short a=-5;
unsigned short b=-5u;
if(a==b)
    printf("A1");
else
    printf("B2");
我读过integer升级,但我仍然不清楚,在这里的示例中它是如何工作的?有人能完整地发布编译器在加宽/截断值时遵循的步骤吗

a == b
在上述表达式中,
a
b
都提升为
int

unsigned short b=-5u;
在此声明中,
-5U
通过整数转换(C99,6.3.1.3p2在此适用)转换为
无符号短
,并成为一个大值

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

b
如果
USHRT\u MAX
(unsigned short)65535,则值为
(unsigned short)((unsigned int)USHRT\u MAX+1-5)
,即
(unsigned short)65531

因此,你得到的是:

(短)-5==(无符号短)65531

将两个操作数的整数提升为以下值后,该值等效:

-5==65531


这相当于
0

short
无符号short
是一种转换(因此具有转换秩)


short
to
int
是一种提升(因此具有提升等级)

由于排名的原因,晋升优先于转换。提升发生在算术和其他运算期间。仅当将一个整型存储在另一个整型中时,就会发生转换。算术运算可以导致转换和升级,以便将类型强制在一起。再举一个例子:

unsigned int u = 2; 
int i = 2; 
u + i;
i
已转换(未升级)为
无符号


您的值被转换为更大的值,因为它由于
无符号而被环绕。然后,它们被提升为
int
。因此
a!=b
正因为如此。

让我们浏览一下您的代码:

short a = -5;
a=-5,适合短字符。到目前为止很容易

unsigned short b = -5u;
-5u表示将一元
-
运算符应用于常数5u。5u是(unsigned int)5,一元
-
没有提升,因此最终得到4294967291,即2^32-5。(更新:我的原始答案有点错误;请参阅测试脚本,其中显示此版本在此处是正确的)

现在当把它放在b中时,它被截断为一个无符号的短字符(通常是2字节),所以b=65531,也就是2^16-5

if( a == b )
在这一行中,a和b都升级为ints,以便正确进行比较。如果他们被提拔为短裤,b可能会绕圈子。如果他们被提拔为未签名的卖空者,则可能会出现一个新的卖空者


这就像说
如果((int)a==(int)b)
。a=-5,so(int)a=-5,b=65531,so(int)b=65531,因为int比shorts大。

您使用哪种编译器?可能很有用。整数提升只发生在
a==b
表达式中-这就是你要问的吗?我不确定你期望的是什么,它永远不会相等,因为
无符号短b=-5u
将环绕到
65531
。我不会说
-5u
的可能重复是没有意义的-它是由标准定义的。嗯,
-5u
是完全合理的。它将
-
应用于整数常量
5u
。您遇到了我感兴趣的一点:因此在-5存储在短“a”变量中之前。。。它的常量值被视为一个整数,对吗?我对此很感兴趣point@PeteBecker更新了答案以说明原因;我没有想到。约翰尼,是的,它是一个整数。或者,您可以使用5l使其成为long,或者使用5ul使其成为unsigned long,例如。还要注意的是,一个好的编译器会使这一点变得非常复杂,但不会以一种可能会注意到的方式进行。@JohnnyPauling:-5在赋值之前被转换为带符号的int。然后它被截断为一个短的,但在这个例子中这很好。re“在2的补码系统上”,不管符号整数表示如何,都是这样的,因为神圣的标准要求它是二进制的,并且因为5比所需的最小范围小得多,因为标准要求无符号算术为模2^n,其中n是表示位数。例如,对于32位
无符号
和16位
无符号短
表达式
-5u
本身产生值2^32-5,然后模2^16的值必然是2^16-5。再说一遍,不管符号整数表示法是什么。@Cheersandhth.-Alf Agree,我在你发表评论之前删除了这句话。我从一个2的补码系统开始,因为我最初想添加关于(no)表示变化的信息。