当前位置:网站首页>第2章 数据的表示和运算

第2章 数据的表示和运算

2022-06-10 08:26:00 我真不聪明

目录

2.1 数制与编码

2.1.1 进位计数制及其相互转换

进位计数法

不同进制数之间的相互转换

除基取余法

乘积取整法

2.1.2 定点数的编码表示

真值与机器数

原码

补码

变形补码

移码

2.2 运算方法和运算电路

2.2.1 基本运算部件

1. 一位全加器

2. 串行进位加法器

3. 并行进位加法器

2.2.2 定点数的移位运算

1. 算术移位

2. 逻辑移位

3. 循环移位

2.2.3 定点数的加减法运算

1. 补码的加减法运算

2. 补码加减运算电路

3. 溢出判断

2.2.4 定点数的乘除运算

1. 原码一位乘法

2. 补码一位乘法(Booth算法)

3. 原码除法运算

4. 补码除法运算(加减交替法)

2.2.5 数据的存储和排列

1. 大端方式和小端方式存储

 2. 数据按边界方式存储

2.3 浮点数的表示与运算

2.3.1 浮点数的表示

2.3.2 浮点数的规格化

2.3.3 IEEE 754 标准

 2.4 C语言类型转换与浮点数类型

2.4.1 有符号数和无符号数的转换

2.4.2 长整数转换为短整数

2.4.3 C语言中的浮点数类型


2.1 数制与编码

2.1.1 进位计数制及其相互转换

在计算机系统内部,所有信息都是用二进制编码,这样做的原因如下:

  1.  二进制只有两种状态,使用有两个稳定状态的物理器件就可以表示二进制中的每一位,制造成本低,例如用高低电平或电荷的正负性都可以很方便地表示0和1。
  2. 二进制位10正好与逻辑值真 假 对应,为计算机实现逻辑运算和程序中的逻辑判断提供了便利条件。
  3.  二进制编码和运算规则都很简单,通过逻辑门电路能方便的实现算术运算。

进位计数法

一个r进制数的数值可以表示为K_{n}r^{n}+K_{n-1}r^{n-1}+\cdot \cdot \cdot +K_{0}r^{0}+K_{-1}r^{-1}+\cdot \cdot \cdot +K_{-m}r^{-m},在上述式子中,r为基数,r^{i}是第i位的位权(规定整数最低位为第0位);K_{i}的取值是从0~r-1共r个数码中的任何一个。

不同进制数之间的相互转换

  • 二进制转换为八进制和十六进制

  • 任意进制数转换为十进制数
  •  十进制数转换为任意进制数

采用基数乘除法,对整数部分用除基取余法,对小数部分用乘积取整法,最后将结果拼接。

除基取余法

整数部分除基取余,最先取得的余数为数的最低位,商为0时结束。

乘积取整法

小数部分乘基取整,最先取得的整数为数的最高位,乘积为1.0时结束。

2.1.2 定点数的编码表示

真值与机器数

  1. 真值是机器数所代表的实际值,即带有+-的值。
  2. 在计算机中,通常将数的符号和数值一起编码,将数据的符号数字化,通常用0表示正,1表示负;这种把符号数字化的数称为机器数。

原码

用机器数的最高位表示数的符号位,其余各位表示数的绝对值。

纯整数的原码定义:

  1. 2^n> x\geq0时,[x]=0 x
  2. 0> x\geq -2^n时,[x]=2^n-x

例如x_1=+1110[x_1]=00001110x_2=-1110[x_2]=2^7-1110=1 0001110

纯小数的原码定义:

  1. 1> x\geq 0时,[x]=x
  2. 0\geq x> -1[x]=1-x

例如x1=+0.1101[x_1]=0.1101000x_2=-0.1101[x2]=1-0.1101=1.1101000

若机器字长为n位,原码的表示范围为-(2^{n-1}-1)\leq 2^{n-1}-1

补码

补码出现是让减法操作变为加法,节省了硬件成本。这里主要探讨整数的补码。二进制补码在书上的表示方法:

  1. 正数的补码就是其本身
  2. 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

但在实际中,补码的本质是人为规定的一种特殊的模运算,如图。

若字长为n位,则补码的表示范围为-2^{n-1}\leq x\leq 2^{n-1}-1

变形补码

变形补码亦称为模4补码,双符号位的补码小数。

移码

移码常用于表示浮点数的阶码,它只能用于表示整数。移码是在真值X上加上一个偏置值,相当于X在数轴上偏移了若干单位,这就是移码一词的由来。移码的定义为[x]=2^n+x

例如对于8位机器字长正数x_{1}=+10101x_2=-10101[x_{1}]=2^7+10101=1,001010101[x_{2}]=2^7-10101=0,1101011

移码具有以下特点:

  1. 移码中的零表示唯一
  2. 移码全0代表最小真值-2^{n-1};全1代表最大真值2^{n-1}-1
  3. 移码保持了数据原有的大小顺序,即移码越大真值越大。
  4. 原码、反码的表示在数轴上对称,且二者都存在+0-0

2.2 运算方法和运算电路

2.2.1 基本运算部件

1. 一位全加器

全加器(FA)是最基本的加法单元,有加数A、加数B与低位传来的进位C共三个输入。有本为和S与像高位的进位C' 共两个输出。

和表达式:S=A⊕B⊕C

进位表达式:C'=AB+(A⊕B)C

2. 串行进位加法器

把n个全加器相连可以得到n为加法器,称为串行进位加法器。在串行进位加法器中,低位运算产生进位所需时间将影响高位运算的时间;因此串行进位加法器最长运算时间主要是由进位信号的传递时间决定的

3. 并行进位加法器

G=AB,P=A⊕B,全加器的进位表达式为C'=G+PC。由图可知并行进位加法器可以不断传递,因此进位C'仅与A、B、C有关,相互间的进位没有依赖关系。

这种进位方式是快速的,与位数无关。随着加法器位数增加,C的逻辑表达式会越来越长使得电路结构变得很复杂。

2.2.2 定点数的移位运算

1. 算术移位

算术移位的对象是有符号数,在以为过程中符号位保持不变。对于带符号数,左移一位若不产生溢出,相当于乘2;右移一位若不考虑因移出而舍去的末位,相当于除2。

2. 逻辑移位

逻辑移位将操作数视为无符号数。

移位规则:逻辑左移时,高位丢弃,低位添零;逻辑右移时,低位移丢,高位添零。

3. 循环移位

循环移位分为带进位标志位CF 的循环移位,不带进位标志位的循环移位。

2.2.3 定点数的加减法运算

在机器内部并没有小数点,只是人为约定了小数点的位置,小数点约定在最左边就是定点小数,小数点约定在最右边就是定点整数。因此在运算过程中,可以不用考虑对应的定点数是小数还是整数,只用关心符号位和数值位即可。

1. 补码的加减法运算

 假设[X]代表X的补码形式。

补码的加法运算:[A+B]=[A]+[B]

补码的减法运算:[A-B]=[A]+[-B]

2. 补码加减运算电路

当控制端Sub为1时,实现减法运算X+\overline{Y}+1=[A]+[-B]

当控制端Sub为0时,实现加法运算X+Y=[A]+[B]

3. 溢出判断

  1. 采用一位符号位:只要参加操作的两个数符号相同,结果又与原操作数不同,表示结果溢出。S代表运算的结果符号位 V=A_{s}B_{s}\overline{S_{s}}+\overline{A_{s}}\overline{B_{s}}S_{s}
  2. 采用模4补码(双符号位):运算结果的两个符号位S_{s1}S_{s2}相同表示未溢出。溢出判断逻辑表达式为双符号位二者S_{s1}S_{s2}
  3. 采用一位符号位根据数据位的进位情况判断溢出:符号位进位C_{s}最高数位进位C_{1}.

2.2.4 定点数的乘除运算

1. 原码一位乘法

原码一位乘法也称为无符号数乘法,特点是符号位与数值位分开求得。乘积符号由两个数符号异或形成,而乘积的数值部分则是两个数的绝对值相乘之积,步骤如下:

  1. 被乘数和乘数均取绝对值参加运算,看作无符号数。
  2. 部分积是乘法过程的中间结果。初始设置为0。
  3. 从乘数的最低位开始判断:若为1,则部分积加上被乘数|x|,然后右移一位;若为0,则部分积加上0,然后右移一位。
  4. 重复3.步骤直至低位部分积全部移出。

2. 补码一位乘法(Booth算法)

这是一种有符号数的乘法,采用相加和相减操作计算补码数据的乘积。

  1. 符号位参与运算,运算的数均以补码表示。
  2. 被乘数一般取双符号位参与运算,部分积取双符号位且初值为0,乘数取单符号位。
  3. 乘数末位增设附加位(辅助位)初设值0。
  4. 根据辅助值与乘数最后的值来确定操作如图2.2。
  5. 移码按补码右移规则。
  6. 按照上述算法一直到部分积全部移出,再进行一次操作但不移位;也就是进行n+1步操作,但第n+1步不再移位。

3. 原码除法运算

商符和商值分开进行计算,减法操作用补码加法实现。具体操作如下:

  1. 先用被除数减去除数,当余数为正,商上1,余数和商左移一位,再减去除数;当余数为负,商上0,余数和商左移一位,再加上除数
  2. 当n-1步余数为负时,需要加上y来得到正确的余数。

4. 补码除法运算(加减交替法)

符号位和数值位一起参与运算,商符自然形成。除法第一部根据被除数和除数的符号决定是做加法还是减法;上商的原则根据余数和除数的符号位共同决定,同号商上1;异号上商0;最后一步商恒置1

具体操作如下:

  1. 符号位参加运算,除数与被除数均用补码表示,商和余数也用补码表示。
  2. 若被除数与除数同号,则被除数减去除数若被除数与除数异号。则被除数加上除数。
  3. 若余数与除数同号,则商上1,余数左移1位减去除数;若余数与除数异号,则商上0,余数左移一位加上除数。
  4. 重复3.步操作n次。
  5. 若对精度没有特殊要求,则一般采用末位恒置1法。

2.2.5 数据的存储和排列

1. 大端方式和小端方式存储

大端方式按从最高有效字节到最低有效字节的顺序存储数据,即最高有效字节存放在前面。小端方式恰与大端方式相反。

 2. 数据按边界方式存储

数据按边界对齐方式存虽说可能浪费了一点空间,但是可以提高取指令和取数的速度。数据若不按边界存储可以充分利用存储空间,但半字长的指令或字长的指令可能会存储在两个存储字中,需要两次访存。

2.3 浮点数的表示与运算

2.3.1 浮点数的表示

通常浮点数表示为:N=(-1)^S\times M\times R^E

S取值为0或1,用来决定浮点数的符号;M是一个二进制定点小数,称为尾数,通常用原码小数表示;E是一个二进制定点整数,称为阶码或指数,用移码表示R是基数。

2.3.2 浮点数的规格化

尾数的位数决定浮点数的有效数位,有效数位越多,数据的精度越高。因此规定尾数的最高数值位必须是一个有效值。因此需要进行左规和右规操作。

左规:当运算结果的尾数最高位不是有效位即出现0.00XXX时,需要进行左规;左规时,尾数每左移一位、阶码减1。有可能需要多次左规。

右规:当运算结果的位数的有效位进到小数点前面时即出现01.10XXX,需要进行右规;右规时,将尾数右移一位阶码加1。需要右规时,只需要进行一次

2.3.3 IEEE 754 标准

IEEE 754 标准规定了基数隐含为2,阶码采用移码表示,且偏置值D=2^{n-1}-1

对于规格化的二进制浮点数来说,数值的最高位总是1,为了能使尾数多表达一位有效位,将这个1隐藏,称为隐藏位,因此23位尾数实际上表示了24位有效数字。

IEEE 754 标准下规格化短浮点数真值(-1)^S\times 1.M\times 2^{E-D}

对于阶码全0或全1时,有其特别的解释。

 2.4 C语言类型转换与浮点数类型

2.4.1 有符号数和无符号数的转换

由于数据在计算机内部是采用二进制补码表示,当有符号数转换为无符号数时,不改变其数据内容,而是改变其转换为十进制的解释方式

2.4.2 长整数转换为短整数

高位二进制补码截断,保留低位二进制补码。

2.4.3 C语言中的浮点数类型

C语言 中的float double 类型分别对应与IEEE 754 单精度浮点数和双精度浮点数。在C程序中等式的赋值和判断会出现强制类型转换,char->int->long->doublefloat->double 最为常见,从前到后范围和精度都是由小变大,转换过程没有损失。有以下需要注意:

  1. int 转换为float 时,虽然不会发生溢出,但是float 带一位隐藏位,故int 无法精确转换成24位浮点数的尾数,需要进行舍入处理,影响精度。
  2. float double 转换为int 时,因int 没有小数部分,因此数据会向0方向截断(仅保留整数部分)发生舍入。

原网站

版权声明
本文为[我真不聪明]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_40491661/article/details/125065341