符号付き数値を符号なしに変換する方法を理解したい。
私がこれを持っているとしましょう:
byte number = 127; // '1111111'
符号なしにするには、「より大きな」データ型「short」を選択し、AND 演算子に値 0x00ff を適用する必要があります。
short number2;
number2 = number & 0x00ff;
番号を無署名にするのはなぜですか?
Java には、実際には署名されていないプリミティブはありません。
値 127 は実際には '01111111' で表され、最初のビットは符号 (0 は正) です。
符号なしバイトは 0 ~ 255 の値を保持できますが、符号付きバイトの最大値は 127 です。1 バイトは 8 ビットなので、符号付きのものは符号を保持するために 1 を消費します。したがって、127 より大きい値を表現したい場合は、より多くのビット数を持つより大きな型を使用する必要があります。大きい方の型にも符号用の予約ビットがありますが、実際の値に少なくとも 8 ビットが使用されるため、値 255 を表すことができます。
そうは言っても、問題があるため、バイトとショートの使用はおそらく避けるべきです。演算子は実際には int を返すため、結果を short にキャストしていることに気付くでしょう。より適切に実装されているため、Java では int と long に固執する必要があります。
編集: 符号ビットは short の最初のビットであるため、AND 演算子はそれを符号なしにし、バイトの値を保持する 8 ビットを short の最後の 8 ビットにコピーします。したがって、負の数がある場合、1 である最初のビット (つまり、負であることを意味します) が実際には値の一部になります。また、ショートの影響を受ける符号ビットは 2 のべき乗の 2 つの高さにあるため、ショートは常に正になります。
byte: 10101101
||||||| <- actual value
short: 0000000010101101
||||||||||||||| <- actual value
編集 2: ただし、負の値は2 の補数表現を使用するため、期待どおりの値ではない可能性があることに注意してください。すべての正の値は同じままです。
しかし、-128 = 0x10000000 は 128 になり、
-127 = 0x10000001 は 129
になり、-1 = 0x11111111 は 255 になります。
Java には符号なしのデータ型がありません。「より大きな」データ型に切り替えるだけです。それだけです。
負のバイトから int に移動すると、int も負になります。つまり、負の int (または例では short) を取り、上位 3 バイト (int) を 0x00 に設定します。