原码:true code
补码:complemental code
反码:ones-complement
符号位都是用 0 表示「正」,用 1 表示「负」,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。原因在于:
- 可以将
符号位
和数值位
统一处理 加法
和减法
也可以统一处理- 此外,补码与原码可以
相互转换
,其运算过程是相同的,不需要额外的硬件电路
可以理解为一个循环圈。
补码的特性
- 一个负整数的原码与其补码相加,和为模
- 对一个整数的补码再求补码,等于该整数自身
- 补码的正零与负零表示方法相同
整数的补码
求给定数值的补码分以下两种情况:
正数
正整数的补码是其二进制表示,与原码相同。
【例 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)