前提
- 掌握二进制与十进制的转换。
- 掌握原码、反码、补码。
- Java 的整数型 byte 的取值范围。
目的
无需将补码转成原码,再计算原码表示的值:
- 快速计算补码表示的值。
- 两个同类型的值相加后,若溢出,值为?
公理 1
w 位二进制数,此二进制数能够表示的最大值:2w - 1。如 0b11111111 = 28 - 1 = 255。
推导 1
以 8 位为例,设 0b111110 = x。
-x 的原码:1 1111110
-x 的反码:1 0000001
-x 的补码:1 0000010
反码是除了符号位,对原码求反,0b1111111 - 0b1111110 = 0b0000001。不考虑符号位,得到的二进制数值为:(27 - 1) - x = 127 - x。
补码是反码+1,值为:128 - x。如果再加上符号位 1,当成原码看待,值为:-(128 - x) = -128 + x。
-x 的补码是 -128 + x 的原码。
结论 1
设 x < 0,则 x 的补码是 -2w-1 - x 的原码。
例 1:w = 8,计算补码 1 0000011 对应的值。
看符号位为 1,是负数的补码。
-
设此值为 x,x 的补码
1 0000011
是 -128 - x 的原码1 0000011
。 -
-3 的原码
1 0000011
。 -
推出:-128 - x = -3。
-
得到:x = -128 + 3 = -125。
-3 移到左边变为正数,x = -128 + 0b00000011 = -125。
验证:
补码:1 0000011
反码:1 0000010
原码:1 1111101
0b1111101 = 125,再加上符号位,值为 -125
例 2:w = 8,计算补码 1 1010001 对应的值。
值 = -128 + 0b01010001 = -128 + 81 = -47。
推导 2
补码 1 1010001 = -128 + 0b1010001。
二进制数 1 1010001 = 0b10000000 + 0b1010001 = 128 + 0b1010001。
二进制数 = 补码 + 256。
结论 2
x < 0,则 x 的补码被当成二进制数后,值为 x + 2w。
例 3:w = 8,值为 -32 的补码被当作二进制数时,值为?
值 = -32 +