C ++在无符号整数和有符号整数之间进行转换

时间:2013-02-17 17:23:56

标签: c++

为什么下面的代码首先写入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

2 个答案:

答案 0 :(得分:2)

将负有符号整数类型转换为unsigned始终下溢,并产生模运算。 unsigned int x = (unsigned int)-1UINT_MAX存储到x

Example

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大小的位模式。