原答案:
我想通了。 This网页为我清理了它:
Java 整数是 32 位的。最高位保留用于加号或减号。因此您可以设置/取消设置 31 个一位标志
我的误解是位标记使用整数中的第 32 位以这种方式作为负或正标记,好像它是这样做的一个选项 .但是Java以这种方式定义了一个整数,所以它不是一个选项——它是该定义的结果或副产品。整数只有 31 位表示数字本身。第 32 位是加减号。
(写完之后,我发现说“位标志使用”任何东西都没有意义。位标志是概念,整数是具体类型。)
更新:一些观察:
Integer.MIN_VALUE 等于 -2147483648,二进制是
10000000000000000000000000000000
第一位表示否定。 在这种情况下是一个符号位,因为这是一个有符号整数(Integer.MIN_VALUE 是负数,最小值和最大值与零等距)。如果它是一个无符号整数,它只是另一个值位。
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html:
签名:
int:默认情况下,int数据类型为32位有符号二进制补码整数,最小值为-231,最大值为231-1。
无符号:
在 Java SE 8 及更高版本中,您可以使用 int 数据类型来表示一个无符号的 32 位整数,其最小值为 0,最大值为 232-1。使用 Integer 类将 int 数据类型用作无符号整数。有关更多信息,请参阅数字类部分。在 Integer 类中添加了 compareUnsigned、divideUnsigned 等静态方法,以支持无符号整数的算术运算。
再次声明:Integer.MIN_VALUE 等于 -2147483648,在二进制中是
10000000000000000000000000000000
将该“符号位”更改为零不会使2147483648 (Integer.MAX_VALUE)。成功了
00000000000000000000000000000000
这是零。 Integer.MAX_VALUE 二进制是
01111111111111111111111111111111
将“符号位”切换为 1 不会使其成为 MIN_VALUE。
11111111111111111111111111111111
尝试解析失败,因为 32 位对于有符号整数的值部分来说太大了:
System.out.println(Integer.parseInt("10000000000000000000000000000000", 2));
错误:
Exception in thread "main" java.lang.NumberFormatException: For input string:
"10000000000000000000000000000000"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Test.main(Test.java:10)
相当
11111111111111111111111111111111
是
1111111111111111111111111111111
带有表示否定的“符号位”。一个有 32 个 1 的二进制数字是 -1。我现在想不通为什么。我也不知道如何解析负(有符号)二进制文件。这个
Integer.parseInt("-1111111111111111111111111111111", 2)
等于
num: -2147483647
10000000000000000000000000000001
所以它是溢出或什么的......
测试类:
public class BinaryNumberTest {
public static final void main(String[] ignored) {
testNum(Integer.parseInt("-1111111111111111111111111111111", 2), "-1111111111111111111111111111111");
testNum(Integer.MAX_VALUE, "Integer.MAX_VALUE");
testNum(0, "0");
testNum(Integer.MIN_VALUE, "Integer.MIN_VALUE");
}
private static final void testNum(int num, String description) {
System.out.println(description + ": " + num);
System.out.println();
int numMinus1 = num - 1;
System.out.println(" num-1: " + numMinus1);
System.out.println(" " + get32BitZeroPaddedBinaryNum(numMinus1));
System.out.println(" num: " + num);
System.out.println(" " + get32BitZeroPaddedBinaryNum(num));
int numPlus1 = num + 1;
System.out.println(" num+1: " + numPlus1);
System.out.println(" " + get32BitZeroPaddedBinaryNum(numPlus1));
System.out.println();
}
private static final String get32BitZeroPaddedBinaryNum(int num) {
return String.format("%32s", Integer.toBinaryString(num)).replace(' ', '0');
}
}
输出:
-1111111111111111111111111111111: -2147483647
num-1: -2147483648
10000000000000000000000000000000
num: -2147483647
10000000000000000000000000000001
num+1: -2147483646
10000000000000000000000000000010
Integer.MAX_VALUE: 2147483647
num-1: 2147483646
01111111111111111111111111111110
num: 2147483647
01111111111111111111111111111111
num+1: -2147483648
10000000000000000000000000000000
0: 0
num-1: -1
11111111111111111111111111111111
num: 0
00000000000000000000000000000000
num+1: 1
00000000000000000000000000000001
Integer.MIN_VALUE: -2147483648
num-1: 2147483647
01111111111111111111111111111111
num: -2147483648
10000000000000000000000000000000
num+1: -2147483647
10000000000000000000000000000001