关于补码的总结

原码:true code
补码:complemental code
反码:ones-complement

符号位都是用 0 表示「正」,用 1 表示「负」,而数值位,三种表示方法各不相同。

在计算机系统中,数值一律用补码来表示和存储。原因在于:

  • 可以将 符号位数值位 统一处理
  • 加法减法 也可以统一处理
  • 此外,补码与原码可以 相互转换,其运算过程是相同的,不需要额外的硬件电路

补码示意图

可以理解为一个循环圈。

补码的特性

  1. 一个负整数的原码与其补码相加,和为模
  2. 对一个整数的补码再求补码,等于该整数自身
  3. 补码的正零与负零表示方法相同

整数的补码

求给定数值的补码分以下两种情况:

正数

正整数的补码是其二进制表示,与原码相同。

【例 1】+9 的补码是 00001001。(备注:这个 +9 的补码是用 8 位 二进制来表示的,补码表示方式很多,还有 16 位二进制补码表示形式,以及 32 位二进制补码表示形式吗,64 位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。)

负数

求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0 变 1,1 变 0)后加 1。
同一个数字在不同的补码表示形式中是不同的。比如 -15 的补码,在8 位二进制中是 11110001,然而在 16 位二进制补码表示中,就是 1111111111110001。(以下都使用 8 位二进制来表示)

记住:对正数的补码做处理,得到负数的补码;对负数的补码做处理,得到正数的补码。

【例 2】求 -5 的补码。
-5 对应正数 5(00000101)→ 所有位取反(11111010)→ 加1(11111011)
所以 -5 的补码是 11111011。

【例 3】数 0 的补码表示是唯一的。
[+0]补 = [+0]反 = [+0]原 = 00000000
[-0]补 = 11111111+1 = 00000000

-1 的补码表示为:对应正数 1(0000 0001),取反得(1111 1110),加 1 得(1111 1111)
-127 的补码表示为:对应正数 127(0111 1111),取反得(1000 0000),加 1 得(1000 0001)
-128 的补码表示为:对应正数 128(1000 0000),取反得(0111 1111),加 1 得(1000 0000)负数里面最小的数,即 -128

加减法

补码加法:[X+Y]补 = [X]补 + [Y]补

补码减法:[X-Y]补 = [X]补 - [Y]补 = [X]补 + [-Y]补

再思考

求补码为什么要反码 +1 ?

目的就是为了正负相加值溢出后归为 0 啊。(原码 + 反码 = 1111 1111)

某大神的数学解释,我觉得记住上面那句话就好了,还有最上面那个示意图