1. ホーム
  2. java

[解決済み] なぜJavaのバイト範囲は-128から127なのですか?

2023-08-07 11:33:29

質問

なぜバイトが取り得る最小の値が -128 . 私は、最高値が 127 であるからです。 01111111 を2進数で表しますが、どのように -128 を8ビットで表現するにはどうしたらよいでしょうか。正の128はすでに8ビットで、すなわち 10000000 となり、さらに負の符号を表現するために 9 ビット目が必要になります。

どなたか説明をお願いします。

どのように解決するのですか?

答えは 2の補数 .

要するに、Java(そしてほとんどのモダンな言語)は符号付き整数を符号付き倍率表現で表さないということです。言い換えれば、8ビット整数は符号ビットの後に7ビットの符号なし整数が続くのではありません。

その代わりに、負の整数は2の補数という方式で表現されます。これにより、ハードウェアでの演算処理が容易になり、また、正のゼロと負のゼロがあることによる潜在的な曖昧さも解消されます。また、正の0と負の0が混在することによる曖昧さを解消することができます。

2 の補数システムのもう 1 つの興味深い特性は、最初のビットが 効果的に が符号指示子として機能し (つまり、ビット 1 で始まるすべての数値は負)、次の 7 ビットは符号ビットが適用された符号なし数値としてそれ自体で解釈してはいけないということです。

2 の補数はひどく複雑ではありませんが、2 の補数とは何か、どのように、そしてなぜそれが機能するのかを最初によく理解することは、おそらく SO の回答の範囲を超えています。Wikipedia の記事から始めるか、この用語をグーグル検索して、より多くのリソースを入手してください。

128 についての質問を簡単に説明すると、2 の補数を生成する基本的な考え方は、数値の符号なし形式を取り、すべてのビットを反転して 1 を追加することです。つまり、符号なしの128は10000000。これを反転させると01111111となり、1を加えると再び10000000となる。つまり、2の補数系では、10000000は明確に-128であり、+128ではないのです。128以上の数は、負の数の形式と曖昧になるため、2の補数システムを使用して8ビットで表現することはできないのです。