我是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
显然,感觉到,为了表示负数,使用第一个标志。对于正数,此标志也是保留的。这是可以理解的。但是,为什么还有一个负数而不是正数。
答案 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)