C ++算术类型转换,带无符号&签名整数

时间:2017-03-08 02:05:25

标签: c++ integer-promotion

代码:

#include<iostream>
using std::cout; using std::endl;

int main()
{
    unsigned int i = 5;
    int x = -3;

    cout << "(i + x) = " << (i + x) << endl;

    cout << "Set x to -6" << endl;
    x = -6;

    cout << "(i + x) = " << (i + x) << endl;
}

输出:

(i + x) = 2
Set x to -6
(i + x) = 4294967295

在这个例子中,(i + x)返回的结果的类型是无符号整数,但是,我认为对于算术类型转换,有符号整数(在这种情况下为变量“x”)应该是在操作发生之前,“提升”为无符号整数。情况一定不是这样,因为(i + x)的第一个结果是(5 +(2 ^ 31 - 1 - 3))= 4294967297而不是2.我在这里缺少什么?在我看来,只有最终结果被转换为无符号整数,而不是初始操作数。

1 个答案:

答案 0 :(得分:4)

你的错误是假设计算是(5 + (2^31 - 1 - 3))。对unsigned的{​​{1}}解释基于最大值-32^32 - 1),而不是UINT_MAX2^31 - 1)。因此,您需要INT_MAX2^32 - 1 - 3),加上5,并且由于超过UINT_MAX - 3,它会回到UINT_MAX,至少在你的两个&{ #39;补充系统,具有32位2 s。