0

为什么下面这段代码先写B2,然后再写A1?它不应该写两个A1吗?C++ 中的隐式数据类型从有符号整数转换为无符号整数(层次结构更高)

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
4

2 回答 2

2

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

示例

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。

于 2013-02-17T17:34:52.370 回答
1

对于给定的代码

short a=-5;
unsigned short b=-5u;
if(a==b)
    printf("A1");
else
    printf("B2");

对于sizeof(short)<的实现sizeof(int),何时a提升为int-5保留的值,而b提升为int您的时间为您保留 2 k - 5 个值,其中 k 是 an 中的值表示位数unsigned short

所以,因为int它们是不同的,即使它们可能是相同short大小的位模式。

于 2013-02-17T17:39:05.860 回答