原码、反码与补码的详细讲解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档