在 java整形数值表示--基础 中说明了符号数采用补码表示法带来的优势,可是并无说明补码是如何推导过来的。java
假设整形数值最多8位数,当采用无符号数表示法时,数值范围为0~255,而采用有符号数表示法时,可将128-255映射为-128~-1,而0-127保持不变,来表示数值范围-128~127:spa
128=1000_0000~-128.net
129=1000_0001~-127blog
130=1000_0010~-126get
...基础
255=1111_1111~-1二进制
0=0000_0000~0方法
1=0000_0001~1ps
....tar
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的表示正数。这也说明了对于二进制而言,千万不要简单的将首位理解为符号位。