【问题标题】:adding unsigned int to int [duplicate]将 unsigned int 添加到 int [重复]
【发布时间】:2013-05-19 15:50:41
【问题描述】:
#include <iostream>
int main ()
{
    using namespace std;
    unsigned int i = 4;
    int a = -40;
    cout<<a+i<<endl;
    return 0;
}

执行这个给我 4294967260

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

【问题讨论】:

  • 也检查this 一个。

标签: c++ types int unsigned-integer


【解决方案1】:

unsigned intint 相加时,int 在相加之前首先转换为unsigned int(结果也是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

【讨论】:

  • 正确。另一种方法是将 4 转换为 int 然后添加它们,然后如果您想要一个 unsigned int 执行 if 块,如果结果 >= 0 则将其转换为 unsigned int。
  • 为什么int 被转换为unsigned 而不是反过来?
  • 对于二进制补码,您最终会得到相同的位模式——结果的上下文(默认情况下显然是无符号的)决定了结果是有符号还是无符号。
【解决方案2】:

用十六进制表示 i 和 a:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多