【问题标题】:Scala Byte type can contain -128 but not 128Scala Byte 类型可以包含 -128 但不能包含 128
【发布时间】:2017-02-07 07:53:45
【问题描述】:

我是 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

显然,为了表示负数,使用了第一个标志。对于正数,该标志也是保留的。这是可以理解的。但是,为什么负数比正数多一个。

【问题讨论】:

  • 一个非常简单的答案:对于 -128 和 128,你有 2 * 128 + 1 = 257 个数字(包括 0)你想挤进一个字节,它只有 8 位,即 256 个组合.所以你必须牺牲 128 或 -128。为什么是128?这是一个更长的故事。
  • 转到 REPL 并在每个整数类型 ByteShortIntLong 上调用 MinValueMaxValue。 (换句话说,Byte.MinValueByte.MaxValueShort.MinValue 等)你会看到这种模式是一致的。

标签: scala byte primitive-types


【解决方案1】:

因为那是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) 

【讨论】:

  • 好的。但是,为什么负数比正数多一个。它应该包含相同数量的正数和负数。
  • 我值得一提的是,在二进制互补系统中,最高有效位表示负数,因此最大。正数只能有 7 位,因此是 127。从技术上讲,这不是因为翻转位的方式,您可以选择 10000000 作为 128,选择 10000001 作为 -127,加法可以正常工作,但除法会很乱。
猜你喜欢
  • 2012-01-05
  • 2019-11-19
  • 2013-11-22
  • 2016-10-12
  • 2015-09-28
  • 2018-11-26
  • 1970-01-01
  • 2013-12-27
  • 2015-03-11
相关资源
最近更新 更多