在C ++中包装unsigned int的范围?

时间:2015-04-03 04:26:42

标签: c++

我正在阅读C ++ Primer第5版,目前正在执行签名/未签名部分。我有一个简单的问题,就是在这个代码块中有一个环绕:

unsigned u = 10;
int i = -42;
std::cout << i + i << std::endl; // prints -84
std::cout << u + i << std::endl; // if 32-bit ints, prints 4294967264

我认为最大范围是4294967295,计算0,所以我想知道为什么在这个问题上似乎是从4294967296完成环绕。

3 个答案:

答案 0 :(得分:4)

无符号算术是模数(类型的最大值加1)。

如果无符号的最大值为4294967295(2 ^ 32 - 1),则结果将在数学上等于(10-42)modulo 4294967296,等于10-42 + 4294967296,即4294967264

答案 1 :(得分:2)

当超出范围的值转换为无符号类型时,结果是其余部分以目标无符号类型可以容纳的值的数量为模。例如,n转换为unsigned char的结果为n % 256,因为unsigned char可以将值0保存到255

在您的示例中类似,环绕是使用4294967296完成的,这是32位无符号整数可以容纳的值的数量。

答案 2 :(得分:1)

鉴于unsigned int为32位,您可以更正范围为[0,4294967295]。

因此-1是4294967295.这在逻辑上等同于4294967296 - 1,它应该解释你所看到的行为。