2016-09-29 5 views
1

Scalaを初めて使い慣れました。私はそれが-128を含むことができますByteタイプだという奇妙な事実が発生しましたが、ない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は、どうやらそれは負の数を示すために、と感じている、最初のフラグが使用されています。正の数については、このフラグも予約されています。これは理解できる。しかし、なぜ正の数よりも負の数です。

+0

非常に単純な答え:-128と128の両方であなたは(0を含む)2 * 128 + 1 = 257の数字を持っているあなたはで上に絞るしたいがこれは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ビットの2の補数の符号付き整数です。 最小値は-128、最大値は127(両端を含む)です。

説明したように、これはTwo's Complementのためです。

もう少し説明しましょう。バイトは8ビットを保持し、-128の数値を表現したい場合に使用します。我々は128から開始します。

10000000 

そして、我々はビットを反転:

01111111 

、我々は取り戻す1を追加します。

10000000 

これは、-128がどのように表現されるかです。

127にこれは補数は符号を表すために、MSB(最上位ビット)を使用するという事実と整合同等です
01111111 

:これは私たちが補数で表現できる最大の符号付き数値であることを意味します。 wikipediaから

範囲内のすべての整数 表すことができる

アンNビットの2の補数数字系 - (2N - 1)+から(2N - 1 - 1)

だから、我々が持っている:

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

しかし、なぜ正の数よりも負の数です。同じ数の正と負の数を含む必要があります。 –

+0

@ArnabDas私の更新された回答を参照してください。 –

+0

ありがとう@YuvalItzchakov。非常に良い説明。 –

関連する問題