慕瓜9086354
Java整数为32位,并且总是带符号的。这意味着,最高有效位(MSB)用作符号位。用an表示的整数int不过是位的加权和。权重分配如下:Bit# Weight31 -2^3130 2^3029 2^29... ...2 2^21 2^10 2^0请注意,MSB的权数为负(实际上最大可能为负),因此,当该位打开时,整数(加权和)将为负。让我们用4位数字对其进行仿真:Binary Weighted sum Integer value0000 0 + 0 + 0 + 0 00001 0 + 0 + 0 + 2^0 10010 0 + 0 + 2^1 + 0 20011 0 + 0 + 2^1 + 2^0 30100 0 + 2^2 + 0 + 0 40101 0 + 2^2 + 0 + 2^0 50110 0 + 2^2 + 2^1 + 0 60111 0 + 2^2 + 2^1 + 2^0 7 -> the most positive value1000 -2^3 + 0 + 0 + 0 -8 -> the most negative value1001 -2^3 + 0 + 0 + 2^0 -71010 -2^3 + 0 + 2^1 + 0 -61011 -2^3 + 0 + 2^1 + 2^0 -51100 -2^3 + 2^2 + 0 + 0 -41101 -2^3 + 2^2 + 0 + 2^0 -31110 -2^3 + 2^2 + 2^1 + 0 -21111 -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 1111x + ~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。