#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
当 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
用十六进制表示 i 和 a:
i = 4: 0x 0000 0004
a = -40: 0x FFFF FFD8
按照C++的隐式转换规则,a +i中的a会被强制转换为unsigned int,即4294967256。所以a+i=4294967260