Java 整数转二进制混淆
Java Integer to Binary confusion
根据我的理解,Integer
输入Java
是32位有符号的,最高有效位是有符号位。这就是为什么Integer.MAX_VALUE
是2147483647
,也就是:
1111111111111111111111111111111(1 repeated in 31 times).
所以我假设它实际上可以表示为:
01111111111111111111111111111111(a 0 followed by 1 repeated 31 times)
0
表示这是一个正整数。
然后为以下代码:
int test = -2147483647;
String converted = Integer.toBinaryString(test);
System.out.println(converted);
输出为:
10000000000000000000000000000001
为什么输出如上?对我来说,二进制流应该表示为-1
,因为最高有效位是1
表示负数。
像这样:
int minusOne = -1;
String converted1 = Integer.toBinaryString(test);
System.out.println(converted1);
输出同上:
10000000000000000000000000000001
有什么解释吗?
看下面两段,你发现问题了吗:
int test = -2147483647;
String converted = Integer.toBinaryString(test);
System.out.println(converted);
int minusOne = -1;
String converted1 = Integer.toBinaryString(test);
System.out.println(converted1);
您正在打印相同的变量测试,这就是输出相同的原因。如果你打印输出 "minusOne" 它将全是 1。
10000000000000000000000000000001 -> -2147483647 = Integer.MIN_VALUE + 1
11111111111111111111111111111111 -> -1
1111111111111111111111111111111 -> Integer.MAX_VALUE = 2147483647
10000000000000000000000000000000 -> Integer.MAX_VALUE + 1
10000000000000000000000000000000 -> Integer.MIN_VALUE = -2147483648
10000000000000000000000000000001 -> Integer.MIN_VALUE + 1
除了@dragon66 的观点,请注意这些是 two's complement 个数字。它们未表示为符号、大小。
在二进制补码表示中,通过反转所有位然后加 1 来取反一个数。这样,只有一种表示 0。
根据我的理解,Integer
输入Java
是32位有符号的,最高有效位是有符号位。这就是为什么Integer.MAX_VALUE
是2147483647
,也就是:
1111111111111111111111111111111(1 repeated in 31 times).
所以我假设它实际上可以表示为:
01111111111111111111111111111111(a 0 followed by 1 repeated 31 times)
0
表示这是一个正整数。
然后为以下代码:
int test = -2147483647;
String converted = Integer.toBinaryString(test);
System.out.println(converted);
输出为:
10000000000000000000000000000001
为什么输出如上?对我来说,二进制流应该表示为-1
,因为最高有效位是1
表示负数。
像这样:
int minusOne = -1;
String converted1 = Integer.toBinaryString(test);
System.out.println(converted1);
输出同上:
10000000000000000000000000000001
有什么解释吗?
看下面两段,你发现问题了吗:
int test = -2147483647;
String converted = Integer.toBinaryString(test);
System.out.println(converted);
int minusOne = -1;
String converted1 = Integer.toBinaryString(test);
System.out.println(converted1);
您正在打印相同的变量测试,这就是输出相同的原因。如果你打印输出 "minusOne" 它将全是 1。
10000000000000000000000000000001 -> -2147483647 = Integer.MIN_VALUE + 1
11111111111111111111111111111111 -> -1
1111111111111111111111111111111 -> Integer.MAX_VALUE = 2147483647
10000000000000000000000000000000 -> Integer.MAX_VALUE + 1
10000000000000000000000000000000 -> Integer.MIN_VALUE = -2147483648
10000000000000000000000000000001 -> Integer.MIN_VALUE + 1
除了@dragon66 的观点,请注意这些是 two's complement 个数字。它们未表示为符号、大小。
在二进制补码表示中,通过反转所有位然后加 1 来取反一个数。这样,只有一种表示 0。