【发布时间】: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 并在每个整数类型
Byte、Short、Int和Long上调用MinValue和MaxValue。 (换句话说,Byte.MinValue、Byte.MaxValue、Short.MinValue等)你会看到这种模式是一致的。
标签: scala byte primitive-types