1. ホーム
  2. java

[解決済み] 0x80000000と-2147483648はjavaではどう等しいのですか?

2022-02-16 23:25:29

質問

の2進数をとると 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

EDIT 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

解決するには?

を使用すると、このようなことが起こります。 符号付き整数のオーバーフロー 基本的には

を取る方がシンプルです。 byte を例として挙げます。A byte の値は、常に -128 から 127 の範囲にあります(この範囲に含まれる)。ですから、もしあなたが 127 (0x7fです) 1を足すと-128になります。128(0x80)をキャストして byte :

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

オーバーフローは(2s 補数整数表現では)常に表現可能な最も大きい数から最も小さい数へと進みます。

については 符号なし の型では、最高値が0にオーバーフローします(これも表現可能な最低の数です)。これは、Javaでは符号なし型が char :

char x = (char) 0xffff;
x++;
System.out.println((int) x); // 0