web-dev-qa-db-ja.com

Javaでバイトの範囲が-128〜127なのはなぜですか?

バイトが取ることができる最低値が-128である理由がわかりません。バイナリの127であるため、最高値は01111111であることがわかりますが、8ビットのみで-128を表し、そのうちの1つは符号に使用されます。正の128は既に8ビット、つまり10000000であり、負の符号を表すには9番目のビットが必要です。

誰かが私にこれを説明するのを手伝ってもらえますか。

62
Bad Request

答えは 2の補数 です。

つまり、Java(およびほとんどの最新の言語)は、符号付き大きさ表現を使用して符号付き整数を表しません。つまり、8ビット整数は、7ビットが続く符号ビットではありません符号なし整数。

代わりに、負の整数は2の補数と呼ばれるシステムで表されます。これにより、ハードウェアでの算術処理が容易になり、正のゼロと負のゼロのあいまいさもなくなります。負のゼロを削除することの副作用は、範囲の下部に常に1つの追加の負の数があることです。

2の補数システムのもう1つの興味深い特性は、最初のビットが符号インジケータとしてeffectively機能することです(つまり、ビット1で始まるすべての数値は負です)。ただし、次の7ビットは、それ自体が符号ビットが適用される符号なしの数値として解釈されることはありません。

2の補数はそれほど複雑ではありませんが、2の補数が何であり、どのように、そしてなぜ機能するのかを最初に把握することは、おそらくSO answer。または、より多くのリソースの用語をグーグルで検索します。

-128についてのクエリに簡単に対処しようとする場合、2の補数を生成する背後にある基本的な考え方は、符号のない形式の数値を取得し、すべてのビットを反転して1を追加することです。したがって、符号なし128は10000000です。反転、01111111であり、1を追加すると再び10000000になります。したがって、2の補数システムでは、10000000は-128であり、+ 128ではありません。 +128以上の数は、負の数の形式ではあいまいになるため、2の補数システムを使用して8ビットで表現することはできません。

77
Tyler McHenry

2の補数は次のように機能します。

1バイトは8ビットで構成されます。

00000000は0を意味します

11111111は255を意味します

ただし、数値がそのように表示された場合、結果の数値が正か負かを区別しません。このため、左側のビットからこの情報が得られます。左側のビットが0の場合、zeroの上に他のビットの値を追加し始めることができます。ビットが1の場合、-128の先頭から追加を開始する必要があります。左側のビットは2の7乗であるためです。

例;

これらの例では、左側のビットは1です。これは、-128の上に他のビットの値を追加することを意味します。

10000000 = -128(-128 + 0)

10000001 = -127(-128 + 1)

10000011 = -125(-128 + 3)

10000111 = -121(-128 + 7)

同じビットですが、今回は、左側のビットは0です。つまり、0の先頭に追加し始めています。

00000000 = 0(0 + 0)

00000001 = 1(0 + 1)

00000011 = 3(0 + 3)

00000111 = 7(0 + 7)

今まで大丈夫なら、あなたの質問への答え、

可能な最小数

10000000 = -128

可能な最大数

011111111 = 127

そのため、範囲が-128〜127の間です。

16
Ad Infinitum

ジェームズが彼のコメントで指摘したように、それは2の補数がどのように機能するかによるものです。

他の用語で言えば、2 ^ 8 = 256種類の値を表すことができます。この場合、128個の負の数、127個の正の数、およびゼロとして使用されます。値を表すのに7ビットを使用し、符号に+1ビットを使用すると、1つ少ない値を表すことができ、2つのゼロを持つことにもなります(そのため、2つの値の比較がより複雑になるため、非常に残念です)。

8
Tamás Szelei

基本的な数値型は2 ^ nの数値を表すことができます。ケースn = 2を見てください。 4つのケースを表すことができ、それらをa、b、c、dと呼ぶことができます。その後、_a=-2, b=-1, c=0, d=1_(これは受け入れられている方法です)または_a=-1, b=0, c=1, d=2_(可能ですが使用されていません)のいずれかに同意できます。したがって、ゼロが1つしかなく、2 ^ nの状態を保持している場合、abs(min) != maxnを増やすと境界線が移動しますが、abs(min) != maxは保持されます。

3
Sic

バイトは8ビットで構成されます---> 1ビット符号(正または負)7ビット値

したがって、範囲-2 ^ 7負(-128)から2 ^ 7 -1正(127)

1
Mina Fawzy

in Java byte short int long float doubleのようなすべての変数は、signedとして書き込まれます。そのため、ヘッドビットは常に(負または正)を指定しますが、 2半分は負の値としてシフトされ、0はデフォルトで正の値であるため、次のようになります。

これはポジティブです
+ | 0001001
1 | 0001001
これは負です
-| 0001001
0 | 0001001
バイトが短いので、マイナスは
-000000011111111
0000000011111111

1
Andrei Bazavan

2の補数をとった後、常に余分な数を表す1つの状態を残したので、その状態を-128にします。

0
Rashid Ali

2の補数にはなりません:2 ^ 8(バイトは8桁であり、2つの値の1つを持つことができるため)= 256であるため、バイトが表すことができる最も個別の値は256です。範囲の半分。ここでの質問は、128ではなく127が最大の正の値である理由です。これは、0を表す必要があるためです。

負の数値を使用できない符号なしバイトなど、正の値のみを許可した場合、範囲は0〜255になります。これらは256の異なる値(0を含む)であるためです。