这段代码会打印出B2。
short a=-5;
unsigned short b=-5u;
if(a==b)
printf("A1");
else
printf("B2");
我读过整数提升的相关资料,但在这个例子中它仍然不太清楚,有人能详细地解释编译器在扩展/截断值时遵循的步骤吗?
short a=-5;
unsigned short b=-5u;
if(a==b)
printf("A1");
else
printf("B2");
我读过整数提升的相关资料,但在这个例子中它仍然不太清楚,有人能详细地解释编译器在扩展/截断值时遵循的步骤吗?
让我们来看一下你的代码:
short a = -5;
a = -5,适合short类型。到目前为止很容易。
unsigned short b = -5u;
-
应用于常量5u。5u是(unsigned int)5,一元运算符-
不进行提升,因此得到的结果为4294967291,即2^32-5。(更新:我在原始答案中有点错误;请参见测试脚本,显示此版本是正确的:http://codepad.org/hjooaQFW)if( a == b )
if( (int) a == (int) b )
。而a = -5,所以(int) a = -5,b = 65531,所以(int) b = 65531,因为int类型比short类型大。-
将把这个值(我猜是一个 long
类型)提升为 -5
。” - Daniel Fischera == b
a
和b
都被提升为int
。unsigned short b=-5u;
-5U
通过整数转换的方式转换为 unsigned short
(C99,6.3.1.3p2适用于此处),并变成一个大值。(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
。unsigned
和16位unsigned short
,表达式-5u
本身产生的值为2^32-5,然后该值对2^16取模必然是2^16-5,同样,无论有符号整数的表示方式如何。 - Cheers and hth. - Alfshort
转换为 unsigned short
是一种转换(因此具有转换等级)
short
转换为 int
是一种提升(因此具有提升等级)
由于等级的原因,提升优先于转换。提升发生在算术和其他操作期间。转换仅在将一个整数类型存储在另一个整数类型中时发生。算术运算可以导致转换和提升,以便强制将类型合并。另一个例子:
unsigned int u = 2;
int i = 2;
u + i;
i
被转换(而不是提升)为unsigned
。
由于被转换为unsigned
,您的值被转换为一个更大的值,因为它发生了包装。然后,它们被提升为int
。因此,a != b
就是这个原因。
a==b
表达式中,这就是你所问的全部内容吗? - Carl Norumunsigned short b = -5u
会被转换为65531
。 - Rapptz