java整形数值表示---补码的由来

假设整形数值最多8位数,当采用无符号数表示法时,数值范围为0~255,而采用有符号数表示法时,可将128-255映射为-128~-1,而0-127保持不变,来表示数值范围-128~127:

128=1000_0000~-128

129=1000_0001~-127

130=1000_0010~-126

...

255=1111_1111~-1

0=0000_0000~0

1=0000_0001~1

....

127=0111_1111~127

实际上这种方法叫做补码表示法,例如给定一个负数-100需要得到它的补码需要将255-100+1=156~1001_1100。直观看来首位只要为1即为负数,而0则为正数,但不能简单的认为首位是符号位:

例如假设要表示-5~4之间的10个数,可以用0~9之间的5~9来表示-5~-1,而0~4保持不变,即:

5~-5

6~-4

7~-3

8~-2

9~-1

0~0

1~1

2~2

3~3

4~4

因此首位大于等于5的表示负数,而小于等于4的表示正数。这也说明了对于二进制而言,千万不要简单的将首位理解为符号位。