2015-04-03 101 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應解釋您所看到的行爲。