Javaで符号付きの値を与えるビット単位の演算子を持つ単純なプログラムを作成しました。しかし、そうすると、元の値よりも高い値が返されます。
class bit
{
public static void main(String[] args)
{
int j=10;
System.out.println("jjjj"+~j);
}
}
出力には次のものがあります。
-11. 予想される出力は-9です。何が問題ですか?
Javaで符号付きの値を与えるビット単位の演算子を持つ単純なプログラムを作成しました。しかし、そうすると、元の値よりも高い値が返されます。
class bit
{
public static void main(String[] args)
{
int j=10;
System.out.println("jjjj"+~j);
}
}
出力には次のものがあります。
-11. 予想される出力は-9です。何が問題ですか?
数値 10 の 2 進数を見ると、
0000 0000 0000 0000 0000 0000 0000 1010
最初の 0 は署名ビットです。
署名ビットを含むバイナリを反転すると、次のようになります。
1111 1111 1111 1111 1111 1111 1111 0101
どちらが... Java が符号付き整数を使用していると考えると、-11 です。
符号付きの数値から少し離れて、4 バイトの符号なし整数の値を考えてみると、値は 10 以下になります。4294967285 の値が得られます。
符号なし整数を 2 の補数の符号付き整数に変換するには、2^31 - 1 を超える場合、整数から 2^32 の値を減算します。
2^32 - 4294967285 = -11
0000 1010 // = 10 i.e binary representation of 10
1111 0101 // = ~10 i.e inversion of bits
負の数は 2 の補数形式で格納されます。詳しくはこちらをチェック
0000 1011 // = 11 i.e binary 11
1111 0100 // inversion of bits
1111 0101 // 2's complement of 11 = -11
したがって、
~10 = -11