首页 > 解决方案 > C++ 无符号和有符号转换

问题描述

我以前见过这种问题,但提供的答案并不能为我解决所有问题。发布此问题时,通常会附有下一个示例:

#include <iostream>

int main()
{
    unsigned int u = 10;
             int i = -42;

    std::cout << i + i << std::endl;
    std::cout << i + u << std::endl;

    return 0;
}

输出:

-84
4294967264

所有按预期工作的 int 都转换为无符号数。但是,如果 的绝对值i小于,u则似乎没有发生这种转换。

#include <iostream>

int main()
{
    unsigned int u = 10;
             int i = -3;

    std::cout << i + i << std::endl;
    std::cout << i + u << std::endl;

    return 0;
}

输出:

-6
7

我没有看到任何提到它的答案,也找不到任何解释。尽管这似乎是合乎逻辑的事情发生,但我没有任何解释可以解释这一点。

标签: c++unsigned-integer

解决方案


后:

unsigned int u = 10;
         int i = -3;

i + u通过首先转换i为 来评估收益unsigned int。对于 32-bit unsigned int,此转换包含模 2 32,即 4,294,967,296。这种包装的结果是 -3 + 4,294,967,296 = 4,294,967,293。

转换后,我们添加 4,294,967,293(已转换i)和 10(u)。这将是 4,294,967,303。由于这超出了 32-bit 的范围unsigned int,因此以 4,294,967,296 为模包装。结果是 4,294,967,303 - 4,294,967,296 = 7。

因此打印“7”。


推荐阅读