9

得られるのバイナリ0x80000000を取る

1000 0000 0000 0000 0000 0000 0000 0000

これは とどのように一致しますか-2147483648。私はこのプログラムでこの質問を受けました。

class a
{
        public static void main(String[] args)
        {
                int a = 0x80000000;
                System.out.printf("%x %d\n",a,a);
        }
}

meow@VikkyHacks:~/Arena/java$ java a
80000000 -2147483648

編集2 の補数が負の数を表すために使用されることを学びました。これをその1の補数と同一視しようとすると、

1's Comp. :: 0111 1111 1111 1111 1111 1111 1111 1111
2's Comp. :: 1000 0000 0000 0000 0000 0000 0000 0000

これも意味がありません0x80000000-2147483648

4

3 に答える 3

19

これは、基本的に符号付き整数オーバーフローで発生することです。

byte例として取り上げる方が簡単です。byte値は常に -128 から 127 (両端を含む) の範囲です。したがって、値が127(0x7f) の場合、1 を追加すると -128 になります。byteこれは、128 (0x80) を次のようにキャストした場合にも得られます。

int x = 0x80; // 128
byte y = (byte) x; // -128

オーバーフロー (2 の補数の整数表現) は、常に表現可能な最大の数値から最小の数値へと進みます。

符号なしの型の場合、最大値は 0 にオーバーフローします (これも表現可能な最小の数値です)。唯一の署名されていない型はchar次のとおりであるため、これを Java で表示するのは困難です。

char x = (char) 0xffff;
x++;
System.out.println((int) x); // 0
于 2013-09-15T15:25:07.177 に答える