3 回答
TA贡献1893条经验 获得超10个赞
Java整数为32位,并且总是带符号的。这意味着,最高有效位(MSB)用作符号位。用an表示的整数int不过是位的加权和。权重分配如下:
Bit# Weight
31 -2^31
30 2^30
29 2^29
... ...
2 2^2
1 2^1
0 2^0
请注意,MSB的权数为负(实际上最大可能为负),因此,当该位打开时,整数(加权和)将为负。
让我们用4位数字对其进行仿真:
Binary Weighted sum Integer value
0000 0 + 0 + 0 + 0 0
0001 0 + 0 + 0 + 2^0 1
0010 0 + 0 + 2^1 + 0 2
0011 0 + 0 + 2^1 + 2^0 3
0100 0 + 2^2 + 0 + 0 4
0101 0 + 2^2 + 0 + 2^0 5
0110 0 + 2^2 + 2^1 + 0 6
0111 0 + 2^2 + 2^1 + 2^0 7 -> the most positive value
1000 -2^3 + 0 + 0 + 0 -8 -> the most negative value
1001 -2^3 + 0 + 0 + 2^0 -7
1010 -2^3 + 0 + 2^1 + 0 -6
1011 -2^3 + 0 + 2^1 + 2^0 -5
1100 -2^3 + 2^2 + 0 + 0 -4
1101 -2^3 + 2^2 + 0 + 2^0 -3
1110 -2^3 + 2^2 + 2^1 + 0 -2
1111 -2^3 + 2^2 + 2^1 + 2^0 -1
因此,二进制补码不是表示负整数的排他方案,而是可以说整数的二进制表示始终相同,我们只是忽略了最高有效位的权重。该位确定整数的符号。
在C中,有一个关键字unsigned(在Java中不可用),可用于声明unsigned int x;。在无符号整数中,MSB的权重为正(2^31),而不为负。在这种情况下,an的范围unsigned int是0to 2^32 - 1,而an的int范围是-2^31to 2^31 - 1。
从另一个角度来看,如果您考虑xas 的二的补码~x + 1(NOT x加一),则说明如下:
对于任何x,~x都只是的按位倒数x,因此,凡是x带有1-bit的位置,~x都将带有0-bit的位置(反之亦然)。因此,如果将它们加起来,则加法运算中将不会有进位,并且总和将只是一个整数,其每一位均为1。
对于32位整数:
x + ~x = 1111 1111 1111 1111 1111 1111 1111 1111
x + ~x + 1 = 1111 1111 1111 1111 1111 1111 1111 1111 + 1
= 1 0000 0000 0000 0000 0000 0000 0000 0000
最左边的1位将被丢弃,因为它不适合32位(整数溢出)。所以,
x + ~x + 1 = 0
-x = ~x + 1
因此,您可以看到负数x可以由表示~x + 1,我们称它们为的补数x。
TA贡献1936条经验 获得超6个赞
我已经运行了以下程序来了解它
public class Negative {
public static void main(String[] args) {
int i =10;
int j = -10;
System.out.println(Integer.toBinaryString(i));
System.out.println(Integer.toBinaryString(j));
}
}
输出是
1010
11111111111111111111111111110110
从输出看来,它一直在使用二进制补码。
添加回答
举报