当前位置:网站首页>第2章 数据的表示和运算
第2章 数据的表示和运算
2022-06-10 08:26:00 【我真不聪明】
目录
2.1 数制与编码
2.1.1 进位计数制及其相互转换
在计算机系统内部,所有信息都是用二进制编码,这样做的原因如下:
- 二进制只有两种状态,使用有两个稳定状态的物理器件就可以表示二进制中的每一位,制造成本低,例如用高低电平或电荷的正负性都可以很方便地表示0和1。
- 二进制位1和0正好与逻辑值真 和假 对应,为计算机实现逻辑运算和程序中的逻辑判断提供了便利条件。
- 二进制编码和运算规则都很简单,通过逻辑门电路能方便的实现算术运算。
进位计数法
一个r进制数的数值可以表示为
,在上述式子中,
为基数,
是第i位的位权(规定整数最低位为第0位);
的取值是从0~r-1共r个数码中的任何一个。
不同进制数之间的相互转换
- 二进制转换为八进制和十六进制

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

- 十进制数转换为任意进制数
采用基数乘除法,对整数部分用除基取余法,对小数部分用乘积取整法,最后将结果拼接。
除基取余法
整数部分除基取余,最先取得的余数为数的最低位,商为0时结束。
乘积取整法
小数部分乘基取整,最先取得的整数为数的最高位,乘积为1.0时结束。
2.1.2 定点数的编码表示
真值与机器数
- 真值是机器数所代表的实际值,即带有+或-的值。
在计算机中,通常将数的符号和数值一起编码,将数据的符号数字化,通常用0表示正,1表示负;这种把符号数字化的数称为机器数。
原码
用机器数的最高位表示数的符号位,其余各位表示数的绝对值。
纯整数的原码定义:
- 当
时,![[x]=0 x](//img.inotgo.com/imagesLocal/202206/10/202206100825499958_49.gif)
- 当
时,![[x]=2^n-x](//img.inotgo.com/imagesLocal/202206/10/202206100825499958_21.gif)
例如
,
;
,![[x_2]=2^7-1110=1 0001110](http://img.inotgo.com/imagesLocal/202206/10/202206100825499958_42.gif)
纯小数的原码定义:
- 当
时,![[x]=x](//img.inotgo.com/imagesLocal/202206/10/202206100825499958_43.gif)
- 当
,![[x]=1-x](//img.inotgo.com/imagesLocal/202206/10/202206100825499958_28.gif)
例如
,
;
,![[x2]=1-0.1101=1.1101000](http://img.inotgo.com/imagesLocal/202206/10/202206100825499958_40.gif)
若机器字长为n位,原码的表示范围为
补码
补码出现是让减法操作变为加法,节省了硬件成本。这里主要探讨整数的补码。二进制补码在书上的表示方法:
- 正数的补码就是其本身
- 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
但在实际中,补码的本质是人为规定的一种特殊的模运算,如图。

若字长为n位,则补码的表示范围为
变形补码
变形补码亦称为模4补码,双符号位的补码小数。
移码
移码常用于表示浮点数的阶码,它只能用于表示整数。移码是在真值X上加上一个偏置值,相当于X在数轴上偏移了若干单位,这就是移码一词的由来。移码的定义为
。
例如对于8位机器字长正数
,
,
,
。
移码具有以下特点:
- 移码中的零表示唯一
- 移码全0代表最小真值
;全1代表最大真值
- 移码保持了数据原有的大小顺序,即移码越大真值越大。
- 原码、反码的表示在数轴上对称,且二者都存在+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]](http://img.inotgo.com/imagesLocal/202206/10/202206100825499958_12.gif)
补码的减法运算:![[A-B]=[A]+[-B]](http://img.inotgo.com/imagesLocal/202206/10/202206100825499958_15.gif)
2. 补码加减运算电路

当控制端Sub为1时,实现减法运算![X+\overline{Y}+1=[A]+[-B]](http://img.inotgo.com/imagesLocal/202206/10/202206100825499958_9.gif)
当控制端Sub为0时,实现加法运算![X+Y=[A]+[B]](http://img.inotgo.com/imagesLocal/202206/10/202206100825499958_30.gif)
3. 溢出判断
- 采用一位符号位:只要参加操作的两个数符号相同,结果又与原操作数不同,表示结果溢出。S代表运算的结果符号位
。 - 采用模4补码(双符号位):运算结果的两个符号位
相同表示未溢出。溢出判断逻辑表达式为双符号位二者
⊕
; - 采用一位符号位根据数据位的进位情况判断溢出:符号位进位
⊕最高数位进位
.
2.2.4 定点数的乘除运算
1. 原码一位乘法
原码一位乘法也称为无符号数乘法,特点是符号位与数值位分开求得。乘积符号由两个数符号异或形成,而乘积的数值部分则是两个数的绝对值相乘之积,步骤如下:
- 被乘数和乘数均取绝对值参加运算,看作无符号数。
- 部分积是乘法过程的中间结果。初始设置为0。
- 从乘数的最低位开始判断:若为1,则部分积加上被乘数|x|,然后右移一位;若为0,则部分积加上0,然后右移一位。
- 重复3.步骤直至低位部分积全部移出。
2. 补码一位乘法(Booth算法)
这是一种有符号数的乘法,采用相加和相减操作计算补码数据的乘积。

- 符号位参与运算,运算的数均以补码表示。
- 被乘数一般取双符号位参与运算,部分积取双符号位且初值为0,乘数取单符号位。
- 乘数末位增设附加位(辅助位)初设值0。
- 根据辅助值与乘数最后的值来确定操作如图2.2。
- 移码按补码右移规则。
- 按照上述算法一直到部分积全部移出,再进行一次操作但不移位;也就是进行n+1步操作,但第n+1步不再移位。
3. 原码除法运算
商符和商值分开进行计算,减法操作用补码加法实现。具体操作如下:
- 先用被除数减去除数,当余数为正,商上1,余数和商左移一位,再减去除数;当余数为负,商上0,余数和商左移一位,再加上除数
- 当n-1步余数为负时,需要加上y来得到正确的余数。
4. 补码除法运算(加减交替法)
符号位和数值位一起参与运算,商符自然形成。除法第一部根据被除数和除数的符号决定是做加法还是减法;上商的原则根据余数和除数的符号位共同决定,同号商上1;异号上商0;最后一步商恒置1。
具体操作如下:
- 符号位参加运算,除数与被除数均用补码表示,商和余数也用补码表示。
- 若被除数与除数同号,则被除数减去除数若被除数与除数异号。则被除数加上除数。
- 若余数与除数同号,则商上1,余数左移1位减去除数;若余数与除数异号,则商上0,余数左移一位加上除数。
- 重复3.步操作n次。
- 若对精度没有特殊要求,则一般采用末位恒置1法。
2.2.5 数据的存储和排列
1. 大端方式和小端方式存储
大端方式按从最高有效字节到最低有效字节的顺序存储数据,即最高有效字节存放在前面。小端方式恰与大端方式相反。

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

2.3 浮点数的表示与运算
2.3.1 浮点数的表示
通常浮点数表示为:
S取值为0或1,用来决定浮点数的符号;M是一个二进制定点小数,称为尾数,通常用原码小数表示;E是一个二进制定点整数,称为阶码或指数,用移码表示。R是基数。
2.3.2 浮点数的规格化
尾数的位数决定浮点数的有效数位,有效数位越多,数据的精度越高。因此规定尾数的最高数值位必须是一个有效值。因此需要进行左规和右规操作。
左规:当运算结果的尾数最高位不是有效位即出现0.00XXX时,需要进行左规;左规时,尾数每左移一位、阶码减1。有可能需要多次左规。
右规:当运算结果的位数的有效位进到小数点前面时即出现01.10XXX,需要进行右规;右规时,将尾数右移一位阶码加1。需要右规时,只需要进行一次。
2.3.3 IEEE 754 标准
IEEE 754 标准规定了基数隐含为2,阶码采用移码表示,且偏置值

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

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

2.4 C语言类型转换与浮点数类型
2.4.1 有符号数和无符号数的转换
由于数据在计算机内部是采用二进制补码表示,当有符号数转换为无符号数时,不改变其数据内容,而是改变其转换为十进制的解释方式。
2.4.2 长整数转换为短整数
高位二进制补码截断,保留低位二进制补码。
2.4.3 C语言中的浮点数类型
C语言 中的float 和double 类型分别对应与IEEE 754 单精度浮点数和双精度浮点数。在C程序中等式的赋值和判断会出现强制类型转换,char->int->long->double;float->double 最为常见,从前到后范围和精度都是由小变大,转换过程没有损失。有以下需要注意:
- int 转换为float 时,虽然不会发生溢出,但是float 带一位隐藏位,故int 无法精确转换成24位浮点数的尾数,需要进行舍入处理,影响精度。
- float 或double 转换为int 时,因int 没有小数部分,因此数据会向0方向截断(仅保留整数部分)发生舍入。
边栏推荐
- Model deployment
- Do a good job in data strategic planning and activate data value
- [cryptography] AES encryption and decryption
- La capitale thaïlandaise de Bangkok a été nommée par Forbes « la ville la plus digne d'être visitée après l'épidémie ».
- 2022.06.07 learning contents
- Global industry analysis report of medium voltage instruments in 2022
- 2022.06.04学习内容
- 服务管理与通信,基础原理分析
- 用微信小游戏实现龙舟大战-打粽子
- Guys, help me! Reinstall mysql, and the current root password appears when the password is set
猜你喜欢

泰國曼穀大城府被福布斯評為“後疫情時代最值得一去的城市”

浏览器中如何使用 module export import: Uncaught SyntaxError: Cannot use import statement outside a module 问题

Guys, help me! Reinstall mysql, and the current root password appears when the password is set

Link Time Optimizations: New Way to Do Compiler Optimizations

【Lingo】运算符

接口测试怎么进行,如何做好接口测试

How is the computer network often disconnected? Start with these questions

Model deployment

Service management and communication, basic principle analysis

Grafana启动失败报错:Grafana-server Init Failed: Could not find config defaults, make sure homepath command
随机推荐
Idea JDBC error
Wechat applet bidirectional data binding, parent-child parameter transfer
Smart light 2022 Global Industry Analysis Report
Renewable energy consulting 2022 Global Industry Analysis Report
数据库主键用uuid好还是雪花或者其他什么比较好呢
Oracle SQL command line (II. View)
【密码学】AES加解密
Introduction to temporal database incluxdb
How to use module export import: uncaught syntaxerror: cannot use import statement outside a module
Basic process of web security penetration test
Software testing: 10 super practical testing rules known after work
Ten working principles for STM32 MPU developers
用微信小游戏实现龙舟大战-打粽子
Internet comics 2022 Global Industry Analysis Report
Research Report on hydraulic fracturing chemicals industry - market status analysis and development prospect forecast
Research Report on underwater plasma cutting machine industry - market status analysis and development prospect forecast
Vulnerability recurrence_ Cve-2020-0796 eternal black vulnerability_ Pit encounter_ resolved
USB TYPE -A -B -C 接口
Grafana server init failed: could not find config defaults, make sure HomePath command
業務系統該如何防病毒
时,![[x]=0 x](http://img.inotgo.com/imagesLocal/202206/10/202206100825499958_49.gif)
时,![[x]=2^n-x](http://img.inotgo.com/imagesLocal/202206/10/202206100825499958_21.gif)
时,![[x]=x](http://img.inotgo.com/imagesLocal/202206/10/202206100825499958_43.gif)
,![[x]=1-x](http://img.inotgo.com/imagesLocal/202206/10/202206100825499958_28.gif)
;全1代表最大真值
。
相同表示未溢出。溢出判断逻辑表达式为双符号位二者
⊕
;
⊕最高数位进位
.