原码、反码与补码的详细讲解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、概述
大家都知道,一个十进制数在计算机中都是以二进制数的形式存储的。十进制数是有正负之分的,那么如何在计算机中来表示正号和负号呢?
我们通常使用二进制数的最高位来表示数的符号:“0”来表示正号,“1”来表示负号。
在计算机中整型数值数据的编码主要有:
z原码
z反码
z补码
在开始讲述这三种编码方法前,我们首先介绍一下机器数、真值、模数的概念。
1.机器数
数(含符号)在机器中的编码表示。
2.真值
机器数所对应的真实数值。
3.模数
一个计量器的容量或与零等价的数。
z对于一个n位计数器,每1位有R种状态,每种状态代表1个数,从“0”开始计数。
z计数器所能计的数值的个数即模数。
z计数器的模数 = 计数器的最大值+1 。
z计数器的模数(R n)取决于基数(R)和位数(n)
例子01 2位十进制计数器的模数是多少?
解:R=10 n=2 模数=R n = 102 = 99(最大的2位十进制数)+1 = 100 例子02 8位二进制计数器的模数是多少?
解:R=2 n=8 模数=R n = 28 = 255(最大的8位二进制数)+1 = 256
4. 为什么使用编码来表示“数”?
为了方便计算机的处理,简化计算过程。
二、原码
1. 定义
022011
≤<−−<≤−−X
X X n n 21−X n =
原][X
其中:n 为二进制的位数
原码的表示范围: )12(~)12(11−−−−−n n 问题:当n=8时,原码的表示范围是多少?请用十进制数表示。
2. 求原码的方法
求原码的方法概括起来有两种
z 根据定义求原码
z 直接写出原码
(1) 根据定义求原码
例子03
已知:a = +2 ,b = -2 ,根据定义求a ,b 的原码[ a ]原和[ b ]原。设n = 8 。
解:根据公式有 [ a ]原 = a = (0000 0010)2
[ b ]原 = 2 n-1 – b
= 28-1 – ( -2) = 27+2
1000 0000
+ 10
1000 0010
(2) 直接写出原码
这种方法跟我们书上一样,不再赘述。
3. 原码表示方法存在的问题
(1) 0 有两种表示方法(理由见书上相关章节)
(2) 原码进行加减运算时,符号位应单独处理,运算规则比较复杂(理由
见书上相关章节)
三、反码
1. 定义
021||2011
≤<−−<≤−−X X X n n 2−X n −−n n =
反][X
其中:n 为二进制的位数
反码的表示范围:− )12(~)12(11−− 问题:当n=8时,反码的表示范围是多少?请用十进制数表示。
2. 求反码的方法
求反码的方法概括起来有两种
z 根据定义求反码
z 先求负数的原码,除符号位外按位取反
(1) 根据定义求反码
已知:a = +2 ,b = -2 ,根据定义求a ,b 的反码[ a ]反和[ b ]反。设n = 8 。
解:根据公式有 [ a ]反 = a = [ a ]原 =(0000 0010)2
[ b ]反 = 2 n
= 28
= 28-3
1 0000 0000
- 11 1111 1101
(2) 先求负数的原码,除符号位外按位取反
这种方法跟我们书上一样,不再赘述。
3. 反码表示方法存在的问题
与原码的问题相同,不再赘述。
四、补码
1. 定义
02||2011
<≤−<≤−−X X X n n 2−X n −−n n =
补][X
其中:n 为二进制的位数
补码的表示范围:− )12(~211− 问题:当n=8时,补码的表示范围是多少?请用十进制数表示。
2. 求补码的方法
求补码的方法概括起来有两种
z 根据定义求补码
z 写出对应正数的原码,连同符号位一起按位取反+1
3. 根据定义求补码
已知:a = +2 ,b = -2 ,根据定义求a ,b 的补码[ a ]补和[ b ]补。设n = 8 。
解:根据公式有
[ a ]补 = a = [ a ]原 =(0000 0010)2 [ b ]补 = 2n
– |b|
= 28 – |-2|
= 28 - 2
- 10
1111 1110
4.写出对应正数的原码,连同符号位一起按位取反+1
已知:b = -2 ,求[ b ]补。设n = 8 。
解:
先写出-2对应的正数+2的原码为 0000 0010;
所有的位按位取反加1,得到 1111 1110
5.补码表示方法的特点
与书上讲述相同,不再赘述。
6.为什么负数补码的编码多一个?
假设n=8,那么–28-1 (-128)的补码是多少呢?
[-128]补
= [–28-1]补
= [–27 ]补
= 28–|–27|
= 28 – 27
= 2×27 – 27
= 27
= (1000 0000)2
有人可能会觉得这是-0的补码,是这样的吗?我们只要通过定义求一下-0的补码就可以了。
[-0]补
= 28 - 0
= (1 0000 0000)2 - 0