目录

一、概念

二、补码的意义



一、概念

计算机底层存储数据时,存储的是数据对应的二进制数字。对于整型数据,其二进制表示形式有三种,分别是:原码反码补码,而实际存储的是整型数据的补码

原码、反码以及补码都是有符号的,其中最高位存放符号位,0 表示正数,1 则表示负数。

1. 原码:最高位表示正负,其余位表示数值。例如十进制的正负 1,用 8 位二进制的原码表示:

+1 = [0000 0001]原,-1 = [1000 0001]原

2. 反码:正数的反码和原码相同;负数的反码是在原码的基础上,符号位不变,其余位按位取反。

+1 = [0000 0001]反,-1 = [1111 1110]反

3. 补码:正数的补码和原码也相同;负数的补码是在反码的基础上加 1。

+1 = [0000 0001]补,-1 = [1111 1111]补

补码的最后一位如果是 1,减 1 后变为 0,按位取反则又变回 1;直接取反,再加 1,得到的是一样的结果。

补码的最后几位如果是 10+(它表示 0 出现了一次或多次),减 1 后变成了 01+,按位取反则又变回了 10+;直接取反,再加 1,得到的结果也是一样的。

二、补码的意义

我们人脑可以知道最高位是符号位,在计算的时候就会根据符号位进行加减,但是对于计算机,加减乘除已经是最基础的运算,因此要设计得尽量简单,而让计算机辨别符号位会让计算机的基础电路设计变得复杂。于是人们开始探索将符号位参与运算,并只保留加法的方法,根据运算法则,减去一个数等于加上这个数的负数,即 1 – 1 = 1 + (-1)

1. 使用原码运算

1 – 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [1000 0010]原 = -2

所以让符号位也参与运算时,使用原码,对于减法运算来说,结果是不正确的。这也是计算机内存在存储数据时不使用原码的原因。为了解决这一问题,就出现了反码。

2. 使用反码运算

1 – 1 = 1 + (-1) = [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 000]原 = -0

使用反码的问题在于 0 的符号是负号,而且 [0000 0000]原 和 [1000 0000]原 都表示 0。为了解决这一问题,就出现了补码。

3. 使用补码运算

1 – 1 = 1 + (-1) = [0000 0001]补 + [1111 1111]补 = 1(舍去)[0000 0000]反 = [0000 0000]原 = 0

这样就不存在 -0 的问题了。

我们还可以发现,[1000 0000]补 表示 -128

推理过程:(-1) + (-127) = [1111 1111]补 + [1000 0001]补 = [1000 0000]补。

注意:-128 并没有原码和反码表示