我们都知道在计算机里面,都是用补码来表示数字的,那究竟什么是补码,为什么要使用补码呢?
什么是补码?
介绍补码以前,需要先介绍 原码 和 反码。
原码
简单的来说就是最高位是符号位的二进制数
以8位二进制为例,最高位是符号位,其余就是用2进制来表示10禁止了
[+1]原 = 0000 0001
[-1]原 = 1000 0001
反码
正数的反码是其本身
负数的反码是, 符号位不变,其余各个位取反.
[+1] = [0000 0001]原 = [0000 0001]反
[-1] = [1000 0001]原 = [1111 1110]反
补码
正数的补码就是其本身
负数的补码是其反码+1
[+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]补
[-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补
为什么要用补码?
因为对于计算机来说,它只有加法,但是没有 减 乘 除。
就是说减乘除都是通过加法模拟的。
引入补码后,计算机就可以轻易算法 (-1) + 1 = 0 了
[+1] = [0000 0001]补 [-1] = [1111 1111]补 +1 -1 = [0000 0001] + [1111 1111] = [1 0000 0000] // 最高位溢出,忽略, 最终得到 [0000 0000]
+0 和 -0 的问题
在引入补码以前,0 有 2 种表示方式:
[+0] = [0000 0000]
[-0] = [1000 0000]
引入补码后,我们就解决了这个问题。
0 只有 [0000 0000] 这种表示方式:
0 = 1 + (-1) = [0000 0001]补 + [1111 1111]补 = [0000 0000]补
而 [1000 0000] 用于表示 -128:
-128 = (-1) + (-127) = [1111 1111]补 + [1000 0001]补 = [1000 0000]补
小结:引入补码后,我们把 -0 让给了 -128,可表示的范围从 [-127, 127] 扩充到 [-128, 127]。