Scala Byte类型可以包含-128但不包含128

时间:2016-09-29 06:13:01

标签: scala byte primitive-types

我是Scala的新手。我遇到了一个奇怪的事实,它的Byte类型可以包含-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

显然,感觉到,为了表示负数,使用第一个标志。对于正数,此标志也是保留的。这是可以理解的。但是,为什么还有一个负数而不是正数。

1 个答案:

答案 0 :(得分:2)

因为the range of a Byte on the JVM

  

byte:字节数据类型是8位带符号的二进制补码整数。   它的最小值为-128,最大值为127(含)。

如上所述,这是因为Two's Complement

让我们解释一下。一个字节保存8位,如果我们想表示数字-128。我们从128开始:

10000000

我们反转这些位:

01111111

并添加1.我们回来了:

10000000

这是-128的表示方式。这意味着我们可以用Twos补充代表的最大签名号码是:

01111111

这相当于127.这符合Twos补充使用MSB(最高有效位)来表示符号的事实。

来自wikipedia

  

N位二进制补码数系统可以表示每个整数   在 - (2N - 1)到+(2N - 1 - 1)

的范围内

所以,我们有:

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