为什么下面的代码首先写入B2,然后是A1?不应该写两个A1吗? C ++中的隐式数据类型从signed int转换为unsigned int(层次结构中较高)
short a=-5;
unsigned short b=-5u;
if(a==b)
printf("A1");
else
printf("B2");
// prints B2
int a2=-5;
unsigned int b2=-5u;
if(a2==b2)
printf("A1");
else
printf("B2");
return 0;
// prints A1
答案 0 :(得分:2)
将负有符号整数类型转换为unsigned
始终下溢,并产生模运算。 unsigned int x = (unsigned int)-1
将UINT_MAX
存储到x
。
unsigned int x = (unsigned int) -1;
std::cout << x << std::endl;
x = (unsigned int) -5;
std::cout << x << std::endl;
输出:
4294967295
4294967291
请注意,-1
和-5
都已转换为极高值,其差异也等于4.
答案 1 :(得分:1)
给定代码
short a=-5;
unsigned short b=-5u;
if(a==b)
printf("A1");
else
printf("B2");
用于sizeof(short)
&lt; sizeof(int)
,当a
升级为int
时,您会保留-5
值,当b
升级为int
时,您获得2 k - 保留5个值,其中k是unsigned short
中值表示位的数量。
所以,因为int
它们是不同的,即使它们可能是相同的short
大小的位模式。