#include <iostream>
int main ()
{
using namespace std;
unsigned int i = 4;
int a = -40;
cout<<a+i<<endl;
return 0;
}
执行这个操作会得到4294967260
我知道这里发生了从有符号整数转换为无符号整数的转换,但为什么会得到这个特定的值呢?我注意到它接近于| 2147483647 | + 2147483647 的总和。
#include <iostream>
int main ()
{
using namespace std;
unsigned int i = 4;
int a = -40;
cout<<a+i<<endl;
return 0;
}
执行这个操作会得到4294967260
我知道这里发生了从有符号整数转换为无符号整数的转换,但为什么会得到这个特定的值呢?我注意到它接近于| 2147483647 | + 2147483647 的总和。
当一个unsigned int
和一个int
相加时,会在进行加法运算之前先将int
转换为unsigned int
(结果也是一个unsigned int
)。
-1虽然是第一个负数,但实际上等同于最大的无符号数 - 也就是说,(unsigned int) -1 === UINT_MAX
。
无符号形式下的-2是UINT_MAX - 1
,以此类推,所以-40 === UINT_MAX - 39 === 4294967256
(使用32位int时)。
当然,加4就能得到答案:4294967256 + 4 = 4294967260
。
这是一个很棒的测验,可以学习C(以及类似的C ++)中整数规则:http://blog.regehr.org/archives/721
int
被转换为unsigned
而不是反过来? - almanegra将 i 和 a 转换为十六进制:
i = 4: 0x 0000 0004
a = -40: 0x FFFF FFD8
按照C++的隐式转换规则,a在a + i中将被转换为无符号整数,即4294967256。因此a + i = 4294967260