2015-04-03 80 views
0

我正在浏览C++ Primer 5th Edition,目前正在执行签名/未签名部分。一个简单的问题我已经是当有环绕,也就是说,在这个代码块:回顾C++中unsigned int的范围?

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

有用的提示:有符号b位2的补码数的范围是[ - (2 ^(b-1)),(2 ^(b-1)) - 1]。请注意,这不是对称的。 – wjl 2015-04-03 04:33:10

+0

你认为'0u - 1'应该是什么? – 2015-04-03 04:37:07

+0

'UINT_MAX'保证*至少*'65535'。在大多数现代实现中,它通常是'4294967295'。 – 2015-04-03 04:38:20

回答

1

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

在您的示例中,绕回使用4294967296(32位无符号整数可以容纳的值的数量)完成。

2

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

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

1

鉴于unsigned int为32你认为范围是[0,4294967295]。

因此-1是4294967295.这与逻辑上等价于4294967296 - 1应解释您所看到的行为。