2016-09-29 109 views
1

我是新來的斯卡拉。我遇到一個奇怪的事實,這是Byte類型可以包含-128,但不是128斯卡拉字節類型可以包含-128但不是128

scala> val overflow1NegByte = -129:Byte 
<console>:11: error: type mismatch; 
found : Int(-129) 
required: Byte 
     val overflow1NegByte = -129:Byte 
          ^

scala> val overflow1NegByte = -128:Byte 
overflow1NegByte: Byte = -128 

scala> val overflow1PosByte = 128:Byte 
<console>:11: error: type mismatch; 
found : Int(128) 
required: Byte 
     val overflow1PosByte = 128:Byte 
          ^

scala> val overflow1PosByte = 127:Byte 
overflow1PosByte: Byte = 127 

顯然,它認爲,以表示負數,則使用第一個標誌。對於正數,該標誌也被保留。這是可以理解的。但是,爲什麼多一個負數比正數多。

+0

一個非常簡單的答案:既-128和128你有2 * 128 + 1 = 257號(包括0)你想擠進上te,它只有8位,即256個組合。所以你必須犧牲128或-128。爲什麼128?這是一個更長的故事。 –

+0

轉到REPL並在每個整型類型Byte,Short,Int和Long上調用MinValue和MaxValue。 (換句話說,'Byte.MinValue','Byte.MaxValue','Short.MinValue'等等)你會看到這個模式是一致的。 – jwvh

回答

2

因爲這是the range of a Byte on the JVM

byte:字節的數據類型是一個8位有符號二進制補碼整數。 它的最小值爲-128,最大值爲127(包括)。

如上所述,這是因爲Two's Complement

讓我們來多解釋一下。一個字節保存8位,如果我們想表示數字-128。我們從128開始:

10000000 

我們反轉位:

01111111 

並添加1.我們得到的結果:

10000000 

這是-128是如何表示的。這意味着,最大的有符號數,我們可以用二進制補碼錶示爲:

01111111 

即相當於127這會將與二進制補碼使用MSB(最高有效位)代表本會簽署的事實。

wikipedia

N位的二進制補碼數字系統可以代表在範圍內的每個整數 - (2N - 1)〜+(2N - 1 - 1)

因此,我們有:

-(2^7-1) = (-128) to +(2^7-1 - 1) = +(127) 
+0

好的。但是,爲什麼一個比正數更負。它應該包含相同數量的正數和負數。 –

+0

@ArnabDas查看我的更新回答。 –

+0

謝謝@YuvalItzchakov。非常好的解釋。 –