たとえば、Java データ型 byte は、ストレージ上の 1 バイトに -128 から 127 までのデータを保持します。0 から 127 までの -1 から -128 を区別できるようにするには、割り当てられたストレージのデータ型を取得する追加のデータが必要です。確かに、余分に 1 ビットしかかかりませんが、それでもオーバーします。
Javaはこれをどのように行いますか?
たとえば、Java データ型 byte は、ストレージ上の 1 バイトに -128 から 127 までのデータを保持します。0 から 127 までの -1 から -128 を区別できるようにするには、割り当てられたストレージのデータ型を取得する追加のデータが必要です。確かに、余分に 1 ビットしかかかりませんが、それでもオーバーします。
Javaはこれをどのように行いますか?
プリミティブ型は、すべてのマシンおよびすべての実装で同じになるように定義されており、さまざまなサイズの 2 の補数の整数、単精度および倍精度の IEEE 754 標準浮動小数点数、ブール型、および Unicode 文字 char です。タイプ。—<em> Java 言語仕様: はじめに
0 から 255 までの整数から常に128 を引いたものと考えることができます。
より技術的な: 整数は、そのビットを反転して 1 を追加することにより、否定することができます (また、否定することもできます)。これはほぼ1 の補数(すべてのビットを単純に反転するため、補数) に似ています。しかし、1 の補数には、+0 と -0 という 2 つの異なるゼロがあるという問題があります (浮動小数点数にも同じ問題がありますが、他の理由で、より便利です)。 ☺). 2 の補数は 1 を追加することでこれを解決し、それによって負の値の範囲を拡張します (それが-128 ..127 である理由です)。
ある意味では、符号は数値の最初のビットに実際に「格納」されていると言えます。したがって、1ビットのストレージが必要であるというあなたの観察は正しいです。ただし、a の数値範囲byte
(符号を無視して正または負) は 7 ビットしか必要としないため、1 バイトが再び得られます。