我正在阅读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完成环绕。
答案 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,它应该解释你所看到的行为。