2011-12-04 27 views
1

我正在研究32位和64位。我注意到可以存儲在32位中的整數值範圍是±4,294,967,295,但是Java int也是32位(如果我沒有弄錯),它存儲的值高達±2 147 483 648。對於long也是如此,它存儲的值是0 to ±2^63,但64位存儲的值爲±2^64。這些值如何變化?爲什麼Java整數中的整數不能使用全部32位或64位?

+0

您可以使用Java的簽名基元來存儲無符號值。 Java不提供這方面的支持,但有一些(通常是小的變通)它工作得很好。顯然,在支持無符號類型的語言中,您不需要這些解決方法。 –

+0

要存儲2^64負值和2^64正值,您需要存儲2 * 2^64或2^65或65位的內容。要存儲2^63負值和非負值,您需要2 * 2^63或64位。 –

回答

5

Java中的整數是signed,所以保留一位以表示數字是正數還是負數。 1

和相應的最小負數值是 - 表示稱爲"two's complement notation."採用這種方法,通過Ñ比特表示的正的最大值由

( - 1)2 ^(Ñ)給出的(2 ^(ñ - - 1)),由

給出

「關斷接一個」方面的正和負邊界是由於零。零佔用一個插槽,留下偶數個負數和奇數個正數。如果您將表示的值描繪爲圓形—上的標記(如鐘面—上的小時數),則會看到零比屬於正範圍而不是負範圍。換句話說,如果您將零計數爲正值,您會在正值和負值範圍內發現更多對稱性。

要學習這種表示,請從小開始。取,比方說,三個比特和寫出所有可表示的數字:

  • -4
  • -3
  • - 2
  • -1

你能寫出定義每個數字的三位序列嗎?一旦你明白如何做到這一點,再嘗試一下。從那裏,你可以想象它如何擴展到32位或64位。

該序列形成一個「輪子」,其中每個通過向前一個添加一個而形成,其中從3到-4指出環繞。這種環繞效應(也可能發生在減法中)稱爲"modulo arithemetic."

+0

非常感謝你解釋它是如何工作的。我現在知道了 :)。 –

+1

就我個人而言,我一直認爲把它想成一個多項式b_ {n-1} * 2^{n-1} + b_ {n-2} * 2^{n-2} + .. + b_ { 0} * 2^0'與b的0或1和n =字寬。有符號和無符號的區別就在於第一項是否爲負數。 – Voo

+1

很好的解釋,@Voo。一個更容易理解但更不正式的定義簡單地說,如果高位爲1,則對於8位數字,該值爲,例如,-128,剩餘位的含義不變。這就解釋了爲什麼'11111111'是-1;它相當於'01111111',或127,再加上-128。再次,與您的定義相同,但*意味着*可能會導致混淆乘法。順便說一下,我欣賞TeX符號。 – seh

2

在32位,你可以存儲2^32的值。如果您將這些值設爲0到4294967295或-2147483648到+2147483647則取決於您。這種差異稱爲「簽名類型」與「無符號類型」。語言Java僅支持int的簽名類型。其他語言對於無符號的32位類型有不同的類型。

由於「 - 」部分需要另一位,因此laguage將具有±4294967295的32位類型。

+0

如果您想讓訂單「開箱即用」,您必須使用帶符號的範圍。 – yshavit

0

這是因爲Java int已經簽名,所以您需要一位符號。

相關問題