乐趣区

学习笔记——原码、反码、补码

一、原码表示法
原码表示法是一种最简单的机器数表示法,其最高位为符号位,符号位为“0”时表示该数为正,符号位为“1”时表示该数为负,数值部分与真值相同。若真值为纯小数,它的原码形式为 Xs,.X1X2X3…Xn,其中 Xs 表示符号位。原码定义为:

example-1:
若:X = 0.0110
则:[X]原 = X = 0.0110

若:X = -0.0110
则:[X]原 = 1 – X
= 1 – (-0.0110)
= 1 + 0.0110
= 1.0110

若真值为纯整数,它的原码形式为 XsX1X2X3…Xn,其中 Xs 表示符号位。原码的定义为:

example-2:
若:X = 1101
则:[X]原 = X = 01101

若:X = -1101
则:[X]原 = 2^n – X
= 2^4 – (-1101)
= 10000 + 1101
= 11101

在原码表示中,真值 0 有两种不同的表示形式:
[+0]原 = 00000
[-0]原 = 10000

原码表示方法的优点是直观易懂,机器数和真值间的相互转换很容易,用原码实现乘、除运算的规则很简单;缺点是实现加、减运算的规则较复杂。

二、补码表示法

1. 模和同余为了理解补码表示法,首先需要引入模和同余的概念。
模 (Module) 是指一个计量器的容量,可用 M 表示。例如:一个 4 位的二进制计数器,当计数器从 0 计到 15 之后,再加 1,计数值又变回 0. 这个计数器的容量 M = 2^4 = 16, 即模为 16. 由此可见,纯小数的模为 2,一个字长为 n + 1 位的纯整数的模为 2^(n+1)。同余概念是指两个整数 A 和 B 除以同一个正整数 M,所得余数相同,则 A 和 B 对 M 同余,即 A 和 B 在以 M 为模时是相等的,可读作:A = B(mod M)。对钟表而言,其模 M = 12,故 4 点和 16 点、5 点和 17 点、… 均是同余的,它们可以写作:4 = 16(mod 12),5 =17(mod 12) 利用模和同余概念的补码表示法在进行算数运算时可以使减法运算转化为加法运算,从而简化机器的运算器电路。
假设:时钟停在 8 点,而现在正确的时间是 6 点,这时拨准时钟的方法有两种:(1)将分针倒着旋转两圈(即时钟倒拨两个小时),8 – 2 = 6(做减法)(2)将分针正着旋转 10 圈(即时钟正拨 10 小时),8 + 10 = 6(mod 12)(做加法) 此时,8 – 2 = 8 + 10(mod 12)
设:A = -2, B = 10 则:10/12 = (12 – 2)/12 = 1 + -2/12 故:- 2 和 10 同余。同余的两个数,具有互补关系,- 2 余 10 对模 12 互补,也可以说 - 2 的补数是 10(以 12 为模)。
可见,只要确定了“模”,就可找到一个与负数等价的正数 (该正数即为负数的补数) 来代替此负数,而这个正数可以用模加上负数本身求得,这样就可把减法运算用加法实现了。

example-3:
9 – 5 = 9 + (-5)
= 9 + (12 – 5)
= 9 + 7
= 4(mod 12)

example-4:
65 – 25 = 65 + (-25)
= 65 + (100 -25)
= 65 + 75
= 40(mod 100)

将补数的概念用到计算机中,便出现了补码这种机器数。

2. 补码表示补码的符号位表示方法与原码相同,其数值部分的表示与数的正负有关;对于正数,数值部分与真值形式相同;对于负数,将真值的数值部分按位取反,且在最低位上加 1. 若真值为纯小数,它的补码形式为 Xs,.X1X1…Xn,其中 Xs 表示符号位。补码的定义为:

example-5:
若:X = 0.0110
则:[X]补 = X = 0.0110

若:X = -0.0110
则:[X]补 = 2 + X
= 2 + (-0.0110)
= 10 – 0.0110
= 1.1010

若真值为纯整数,它的补码形式为 XsX1X2…Xn,其中 Xs 表示符号位。补码定义为:

example-6:
若:X = 1101;
则:[X]补 = X = 01101;

若:X = -1101;
则:[X]补 = 2^(n+1) + X
= 2^5 + (-1101)
= 100000 – 1101
= 10011

在补码表示中,真值 0 的便是形式是唯一的:
[+0]补 = [-0]补 = 0000

3. 由真值、原码转换为补码采用补码系统的计算机需要将真值或原码形式表示的数据转为补码形式,以便于运算器对其进行运算。通常,从原码形式入手来求补码。当 X 为正数时,[X]补 = [X]原 = X。当 X 为负数时,其 [X] 补等于把 [X] 原除去符号位外的各位求反后再加“1”。反之,当 X 为负数时,已知 [X] 补,也可通过对其除符号位外的各位求反加“1”求得 [X] 原
当 X 为负数时,由 [X] 原转换为 [X] 补得另一种更有效的方法是:自低位向高位,尾数的第一个“1”及其右部的“0”保持不变,左边的各位取反,符号位保持不变。

example-7:
若:[X]原 = 1.1110011000
则:[X]补 = 1.000110***1000***(符号位和斜体部分不变,其他位取反)

这种方法避免了加 1 运算,是实际求补线路逻辑实现的依据。也可以直接由真值 X 转换为 [X] 补,其方法更简单:数值位自低位向高位,尾数的第一个“1”及其右部的“0”保持不变,左部的各位取反,负号用“1”表示。
example-8:
若:X = -0.1010001010
则:[X]补 = 1.0101110110

三、反码表示法
反码表示法与补码表示法有很多类似之处,对于整数,数值部分与真值形式相同;对于负数,将真值的数值按位取反。它与补码的区别是末位少加一个“1”,因此很容易从补码的定义推出反码的定义。若真值为纯小数,它的反码形式为 Xs,.X1X2…Xn, 其中 Xs 表示符号位。反码的定义为:

example-9:
若:X = 0.0110
则:[X]反 = 0.0110

若:X = -0.0110
则:[X]反 = (2 – 2^-n) + X
= (2 – 2^-4) + (-0.0110)
= 1.1111 + (-0.0110)
= 1.1111 – 0.0110
= 1.1001

若真值为纯整数,它的反码形式为 XsX1X2…Xn,其中 Xs 表示符号位。反码的定义为:

example-10:
若:X = 1101
则:[X]反 = 01101

若:X = -1101
则:[X]反 = (2^(n+1) – 1) + X
= (2^5 – 1) + (-1101)
= 11111 – 1101
= 10010

在反码表示中,真值 0 也有两种不同的表示形式:
[+0]反 = 00000
[-0]反 = 11111

四、三种码制的比较
三种码制既有共同点,又有各自不同的性质,主要区别有以下几点:(1)对于正数它们都等于真值本身,而对于负数各有不同的表示(2)最高位都是表示符号位,补码和反码的符号位可作为数值位的一部分看待,和数值位一起参加运算;但原码的符号位不允许和数值位同等看待,必须分开进行处理(3)对于真值 0,原码和反码各有两种不同的表示形式,而反码只有唯一的一种表示形式(4)原码、反码表示的正、负数范围相对于零来说是对称的;但补码负数表示范围较正数范围宽,能多表示一个最负的数 (绝对值最大的负数),其值等于 -2^n(纯整数) 或 -1(纯小数)
参考:计算机组成原理、Structured Computer Organization、Computer Organization and Design-The Hardware/Software Interface

退出移动版