将无符号整数添加到整数

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

执行这个操作会得到4294967260

我知道这里发生了从有符号整数转换为无符号整数的转换,但为什么会得到这个特定的值呢?我注意到它接近于| 2147483647 | + 2147483647 的总和。


1
也可以查看这个 - Suvarna Pattayil
2个回答

17

当一个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


正确。另一种方法是将4转换为int,然后相加,如果您想要一个无符号的int,则可以使用if块,如果结果大于等于0,则将其转换为无符号int。 - Sellorio
2
为什么int被转换为unsigned而不是反过来? - almanegra
对于二进制补码,您最终得到相同的位模式 - 结果的上下文(默认情况下显然为无符号)确定结果是有符号还是无符号。 - wcochran

1

将 i 和 a 转换为十六进制:

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

按照C++的隐式转换规则,aa + i中将被转换为无符号整数,即4294967256。因此a + i = 4294967260


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接