2016-09-29 69 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。非常好的解释。 –