6
#include <iostream>
int main ()
{
    using namespace std;
    unsigned int i = 4;
    int a = -40;
    cout<<a+i<<endl;
    return 0;
}

执行这个给我 4294967260

我知道发生了从有符号整数到无符号整数的转换,但是如何以及为什么会出现这个特定值?我注意到它接近 | 2147483647 | + 2147483647

4

2 回答 2

15

当 anunsigned int和 anint相加时,在加法发生之前int首先转换为unsigned int(结果也是 an unsigned int)。

-1 虽然是第一个负数,但实际上等价于最大的无符号数 - 即(unsigned int) -1 === UINT_MAX.

无符号形式的 -2 是UINT_MAX - 1,依此类推,所以-40 === UINT_MAX - 39 === 4294967256(使用 32 位整数时)。

当然,加 4 然后给出你的答案: 4294967256 + 4 = 4294967260.

这是一个很棒的测验,您可以在其中学习 C(以及类似的 C++)中的一些整数规则:http: //blog.regehr.org/archives/721

于 2013-05-24T05:45:33.537 回答
1

用十六进制表示 i 和 a:

i =   4: 0x 0000 0004
a = -40: 0x FFFF FFD8  

按照C++的隐式转换规则,a +i中的a会被强制转换为unsigned int,即4294967256。所以a+i=4294967260

于 2013-05-24T05:51:06.077 回答