まず、Javaプリミティブデータ型を要約してみましょう。
バイト:バイトデータ型は、8ビットの符号付き2の補数整数です。
Short:Shortデータ型は、16ビットの符号付き2の補数整数です。
int: Intデータ型は、32ビットの符号付き2の補数整数です。
long: longデータ型は、64ビットの符号付き2の補数整数です。
float: floatデータ型は、単精度32ビットIEEE754浮動小数点です。
double:doubleデータ型は、倍精度64ビットIEEE754浮動小数点です。
boolean:ブールデータ型は1ビットの情報を表します。
char: charデータ型は単一の16ビットUnicode文字です。
ソース
2の補数
「良い例は、256 = 255 + 1であり、(255 − x)がxの1の補数であることに注意することで、2の補数との関係が実現されるというwikiからの例です。
0000 0111 =72の補数は11111001= -7
それが機能する方法は、MSB(最上位ビット)が負の値を受け取るため、上記の場合
-7 = 1001 = -8 + 0+ 0+ 1
正の整数は通常、単純な2進数として格納されます(1は1、10は2、11は3など)。
負の整数は、絶対値の2の補数として格納されます。正の数の2の補数は、この表記を負の数として使用する場合です。
ソース
この回答でいくつかのポイントを受け取ったので、さらに情報を追加することにしました。
より詳細な答え:
特に、正と負の数を2進数で表すには、次の4つの主要なアプローチがあります。
- 署名された大きさ
- 1の補数
- 2の補数
- バイアス
1.署名された大きさ
最上位ビットを使用して符号を表し、残りのビットは絶対値を表すために使用されます。ここで、 0は正の数を表し、1は負の数を表します。例:
1011 = -3
0011 = +3
この表現はより単純です。ただし、10進数を追加するのと同じ方法で2進数を追加することはできないため、ハードウェアレベルでの実装が難しくなります。さらに、このアプローチでは、2つのバイナリパターンを使用して、0、-0(1000)および+0(0000)を表します。
2.1の補数
この表現では、与えられた数のすべてのビットを反転して、その補数を見つけます。例えば:
010 = 2, so -2 = 101 (inverting all bits).
この表現の問題は、0を表す2つのビットパターン、負の0(1111)と正の0(0000)がまだ存在することです。
3.2の補数
数値の負の数を見つけるために、この表現では、すべてのビットを反転してから1ビットを追加します。1ビットを追加すると、0を表す2ビットパターンを持つ問題が解決されます。この表現では、 0(0000)に対して1つのパターンしかありません
。
たとえば、4ビットを使用して4(10進数)の2進数の負の表現を見つけたいとします。まず、4をバイナリに変換します。
4 = 0100
次に、すべてのビットを反転します
0100 -> 1011
最後に、1ビット追加します
1011 + 1 = 1100.
したがって、4ビットの2の補数のバイナリ表現を使用している場合、1100は10進数で-4に相当します。
補数を見つけるより速い方法は、値1として最初のビットを固定し、残りのビットを反転することです。上記の例では、次のようになります。
0100 -> 1100
^^
||-(fixing this value)
|--(inverting this one)
2の補数表現は、0の表現が1つしかないことに加えて、10進数と同じ方法で、符号の異なる偶数の2つの2進数値も追加します。それでも、オーバーフローの場合をチェックする必要があります。
4.バイアス
この表現は、浮動小数点のIEEE754標準の指数を表すために使用されます。すべてのビットがゼロのバイナリ値が最小値を表すという利点があります。また、すべてのビットが1のバイナリ値が最大値を表します。名前が示すように、値はバイアス(通常は2 ^(n-1)または2 ^(n-1)-1)のnビットでバイナリにエンコード(正または負)されます。
したがって、8ビットを使用している場合、10進数の値1は、2 ^(n-1)のバイアスを使用して2進数で表されます。
+1 + bias = +1 + 2^(8-1) = 1 + 128 = 129
converting to binary
1000 0001