计算机原码/反码/补码

二进制在计算机中存储的格式。

原码

最高位为符号位,以人来理解二进制的方式

原码表示

1原码:0000 0001
-1原码:1000 0001

1字节表示范围[1111 1111, 0111 1111] –> [127, -127]

反码

正数的反码是本身
负数的反码是符号位在原码的基础上,符号位不变,其它位取反

反码表示

1原码:0000 0001 == 1反码:0000 0001
-1原码:1000 0001 == -1反码:1111 1110

补码

正数的补码就是其本身
负数的补码是在反码的基础上+1

1原码:0000 0001 == 1反码:0000 0001 == 1补码:0000 0001
-1原码:1000 0001 == -1反码:1111 1110 == -1补码:1111 1111

用补码表示原因

将符号位带入计算机的二进制计算

例子:1 - 1 = 0

原码计算

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
计算正确

反码计算

1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
部分值计算正确

补码计算

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原

补码多出一位

(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补

1 000 0000:最高位表示符号位,低位是000 0000,-1-127=-128(补码:1000 0000)
8位二进制,使用原码或反码表示的范围为[-127, +127],而使用补码表示的范围为[-128, 127]
常用到的32位int类型, 可以表示范围是: [-2^31, 2^31-1]