数据的表示和运算
数制与编码
进位计数法
*基数:*每个数位所用到的不同符号的个数
基数大(十进制) | 基数小(二进制) | |
---|---|---|
位数 | 少 | 多 |
运算(乘法为例) | 100种情况 | 4种情况 |
机器数与真值
机器数:采用二进制表示形式的连通数符一起代码化的数据,在计算机系统中称为机器数或机器码。
真值:与机器鼠对应的用正、负号加绝对值表示的实际数值称为真值。
小数点本身隐含的,不占用存储空间
进制转换
十进制转换
任意进制转10进制
每一位的 位权*指数幂
10进制转换为R进制
长除得到的式子是最低位到最高位 (左边是高位右边是低位)
整数部分
整数部分除以2 除基取余
长除法和短除法
列表求和
小数部分
小数部分乘以2 乘基取整
最左为最高位,从上往下写
除积去余,乘积取整
2进制数之间的转换
二进制,四进制,八进制,十六进制
分组转换法
一位四进制等于2位二进制
一位八进制等于3位二进制
一位十六进制等于4位二进制 H
整数部分:高位补0
小数部分:低位补0
BCD码
Binary-Coded Decimal,用4位二进制来表示1位十进制中 0~9这是个数码
8421码 余3码 2421码
8421
8421码的映射关系:
超过9的部分+0110即6进行修正 数字相加逐位相加即可
4位二进制表示16种不同的状态
BCD码仅适用其中10种–>不同映射方案
余3码:8421码 + 0011(3)
2421码:改变权值定义
大于等于5的数的最高位是1**小于等于5的最高位是0
字符与字符串
字符
ASCII码
32-126为可印刷字体 大写和小写英文字母是连续的 大写和小写字母不连续
65为A 97为a
每个存储单元存放的内容为字节(Byte)的整数倍,即8的整数倍
考题形式:已知某个字符ASCII码值,给某个字符存放在存储单元M,问M中存放的内容
(向前数向后数)
字符串
多个字节存放于同一个区域为字符串,连续的一串字符
大端模式:存储单元内先存储高位字节,后存储低位字节的顺序 (左高右低) 正常观察法。 高位字节存储于低位地址
小端模式:存储单元内先存储低位字节,后存储高位字节的顺序
汉字表示和编码
GB 2312-80:汉字+各种符号共7445
区位码:94区,每区94个位置 共4位 前两位区码后两位位码
国标码:区位码 区码和位码都加20H
汉字内码:国标码区码+位码加80H
输入:输入编码
输出:汉字字形码d
校验码
在数据传送过程中,由于各种物理限制导致信息可能不正确发生信号跳变,所以需要校验码。并且提高机器的抗干扰能力
码距:两个合法码字对应位上数字的不同位的个数
检错能力>大于纠错能力
码距越大检错能力越强
要纠正t位错,编码的码距需要2t+1
校验码和码距的关系
记码距为d,码距与校验码的检错和纠错能力的关系是:
d≥e+1 可检验e个错。
d≥2t+1 可纠正t个错。
d≥e+t+1 且e>t,可检e个错并能纠正t个错。
奇偶校验
奇校验:保证一段数据中出现奇数个1
偶校验:保证一端数据中出现偶数个1
1位校验位
局限:只能发现奇数位或偶数位的错误 无法进行纠错
海明码
多位奇偶校验码,在有效信息位中插入多个校验位进行分组
分组校验—>多个校验位—>校验位标注出错位置
1010 —> 1011
校验位:001
需要校验位位数
检测一位出错并能自动纠正一位错误的海明校验码应满足下面的关系
海明码求解步骤
-
根据公式确定海明码位数:2^k>= n+k+1
-
确定校验位的分布
Pi放于海明号为2^(i-1)
信息位按顺序放到其余位置
-
求校验位的值
将信息位写为二进制 按位数进行异或得到对应校验位的值
异或相同为0不同为1
-
进行检验
将接收到的校验位与对应信息位进行异或得到的值为0则正确,为1则错误
第二步调换也可南理工该种方法
循环冗余校验码CRC
循环冗余校验码(Cyclic Redundancy Check)简称为CRC码。是一种具有很强检错纠错能力的校验码。
CRC码广泛用于磁盘、磁带等辅助存储器的校验,在计算机网络和通信中亦被广泛采用。
循环冗余校验码通过除法运算来建立有效信息和校验位之间的约定关系。
例题(掌握做法即可 )
进行不借位减法,得到最后的余数就为校验位
CRC位数=信息位+生成多项式最高次幂位数
检错和纠错
循环冗余校验的生成多项式要求
在循环冗余校验中,并非任何一个k+l位的多项式都可作为生成多项式使用。生成多项式应满足下列要求:
(1)任何一位发生错误都应使余数不为0;
(2)不同位发生错误应当使余数不同;
(3)对余数作模2除法,应能使余数循环。
选择不同的生成多项式,CRC码的码距不同,因而检错、校错能力也不同。
生成多项式不同,CRC码的出错模式也不同。
计算机的数据表示
-
数据表示:能够由计算机硬件直接识别的数据类型,如顶点数,浮点数
-
硬件直接识别:即某种数据类型可用计算机硬件直接表示出来,并能用计算机指令直接调用。
-
数据表示(取值范围,精度,类型)
- 影响计算机性能的全局性问题
- 直接影响算法的选择,硬件结构与组成
- 随硬件技术和应用需求而变化和发展
- 是复杂的系统设计问题
定点数的表示和运算
无符号数和有符号数
无符号二进制数的数据表示
2字节16位 1一个字2个字节
无符号数:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值
寄存器的长度反应了无符号数的反应范围
表示范围:n位二进制数表示 2n次方种不同的状态
有符号数
真值:带有正负号的真实值
机器数:存放于机器中的真实值
小数点:隐含存储(定点数:事先约定;浮点数:按规则浮动)
定点小数
绝对值:0.00 ~ 0.11 = 1.00 - 0.01
0 ~ 1 - 2-2
有n位尾数的定点小数:-(1-2-n) ~ 1-2-n
定点整数
有n位尾数的顶点整数:-(2n-1) ~ (2n-1)
有符号数表示方法
原码表示法
0有两种表示方法 +0和-0
定点整数
表示方法
原码表示法为带符号的绝对值表示
若字长为n+1,则原码整数表示范围为*-(2n-1)~2n-1* 关于原点对称
定点小数
表示方法
原码表示法:加符号位,加逗号
若字长为n+1,则原码小数的表示范围为*-(1-2-n)<=x<=1-2-n* (关于原点对称)
优劣
特点:简单,直观
补码表示法
一个负数加上“模”即得该负数的补数,一个正数和一个负数互为补数时,其绝对值之和即为模数
正数的补数等于其本身
负数的补数等于模与该数绝对值之差
补码中0的表示是唯一的
作用:将减法操作转变为加法操作,节省硬件成本
补码进行加减操作时,符号位也参与运算
原码->补码
整数
数值部分按位取反
整数补码
若字长为n+1,表示范围:-2n<=x<=2n-1 (比原码多表示-2n)
小数
小数补码
式例
若字长为n+1,则补码的表示范围为*-1<=x<=1-2-n* (比原码多表示-1)
反码表示法
反码有两种表示法
正数的原码反码补码都相同
表示范围与原码相同
整数反码
若字长为n+1位,其表示范围为:-(2n-1)~2n-1 关于原点对称
小数反码
若字长为n+1位,其表示范围为:-(1-2-n)~1-2-n 关于原点对称
原码补码反码互相表示
移码表示法
补码难以判断真值大小,移码是在真值X上加上一个常数(偏置值),通常这个常数取2n
只有整数拥有移码,用于表示浮点数阶码。再IEEE753标准中用于对阶码
特点:
-
0的表示是唯一的
-
真值的移码与补码只差一个符号位
当移码为0时,x为编码所能表示的最小值
无反原补移比较
补码的正0和负0相同
定点数的运算
移位运算
算数移位
通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权,可用移位实现乘法、除法
原码的算数移位
– 符号位保持不变,仅对数值位进行移位
右移:高位补0,低位舍弃。若舍弃的位为0,则相当于/2,若舍去的位不为0,则会丢失精度
左移:低位补0,高位舍弃。若舍弃的位为0,则相当于* 2,若舍弃的位不为0,则会出现严重误差
反码的算数移位
正数的反码与原码相同,因此正数反码的移位运算也和原码相同。
右移:高位补0,低位舍弃
左移:低位补0,高位舍弃
负数的反码数值位与原码相反,因此负数反码的移位运算
右移:高位补1,低位舍弃
左移:低位补1,高位舍弃
补码的算数移位
正数补码算数移位运算
正数补码与原码相同,因此对正数补码的移位运算也和原码相同
右移:高位补0,低位舍弃
左移:低位补0,高位舍弃
负数补码算数移位运算
负数补码=反码末位+1 导致反码右边几个连续的1都因进位而变为0,直到碰到第一个0为止。
规律:负数补码中,最右边的1及右边的规律同原码。最右边的1的左边同反码
右移(同反码):高位补1,低位舍弃。
左移(同原码):低位补0,高位舍弃。
总结
2n移位时n>0则左移,n<0则右移
逻辑移位
逻辑右移:高位补0,低位舍弃
逻辑左移:低位补0,高位舍弃
当做无符号数进行移位运算
作用:存储RGB值
循环移位
不带进位位:用移出的位补上空缺
带进位位:移出的位放到进位位,原进位位补上空缺
作用:适合用于将一个数据的高字节和低字节进行调换
注意:由于原码、反码、补码位数有限,因此某些适合算数移位不能精确等效乘法除法。
加减运算
原码加减法
计算机一般不用,加法器直接对原码进行加法运算,可能出错
原码的加法运算:
正+正:绝对值做加法,结果为正(可能溢出)
负+负:绝对值做加法,结果为负(可能溢出)
正+负:绝对值大的减绝对值小的,符号与绝对值大的相同
负+正:绝对值大的减绝对值小的,符号与绝对值大的相同
原码减法运算,“减数”符号取反,转变为加法:
正-负:正+正
负-正:负+负
正-正:正+正
负-正:负+负
补码加减法
符号位同样参与运算
已知补码求原码:找最右1,1左边数值位全去翻,1及1右数值为全不变
[B]补 和 [-B]补 关系:连符号位全部取反,并末位加1
补码的加法和减法,最后都会转变为加法,由加法器实现运算,符号位也参与运算
溢出判断
补码最终只进行加法运算,所以只考虑加法运算的溢出判断
上溢:正数+正数,——正+正=负
下溢:负数+负数,——负+负=正
判断溢出方法:
-
采用1位符号位
-
采用一位符号位,根据数据位的进位情况判断溢出
符号位的进位Cs 最高数值位的进位C1 上溢 0 1 下溢 1 0
-
采用双符号位
正数符号位为00,负数符号位为11
高位符号位表示,本应得到的符号
低位符号位表示,实际得到的符号
使用异或,相同无溢出,不同则溢出,01上溢,10下溢
实际存储时只存储1个符号位,运算时会复制一个符号位
双符号位,模4补码
单符号位,模2补码
符号扩展
解决溢出发生,短数据扩展为长数据
填补多出的位
定点整数的符号扩展:在原符号位和数值为中间添加新位
整数都填0;负数原码添0;负数反码,补添1
定点小数的符号扩展:在原符号位和数值位后添加新位
正数都添0;负数原码,补码添0;负数反码添1
乘法运算
乘法运算的实现思想
手算十进制
手算2进制
提出问题:
- 实际数字有正负,符号位如何处理
- 乘积的位数扩大一倍,如何处理
- 4个位积最后保存统一相加否
原码一位乘法
实现方法:先加法再移位,重复n次
符号单独处理:符号位=Xs异或Ys
数值位取绝对值进行乘法运算
重复n次
乘数存放于MQ中,高位部分积存放于ACC中,被乘数存放于通用寄存器X中
机器模拟
手算
补码一位乘法
补码一位乘:
进行n轮加法、移位,最后再来一次加法
每次加法可能+0、+[x]补、+[-x]补 根据MQ中最低位、辅助位来确定加什么
原码一位乘和补码一位乘对比:
机器实现补码一位乘:
辅助位是将MQ扩展一位,并且其初始值为0 事实上MQ共n+2位
所有寄存器都统一n+2位,故采用双符号位进行补码运算
手算
两种乘法比较
除法运算
除法运算的思想
手算除法(十进制)
手算除法(二进制)
规律:忽略小数点,每确定一位商,进行一次减法,得到4位余数,在余数末位补0,再确定下一位商。确定5位商即可停止。(机器字长为5位)
原码除法:恢复余数法
上商0/1,得到余数,余数末位补0
符号单独处理:符号位 Xs 异或 Ys
数值为取绝对值进行除法计算
机器实现:
ACC存储被除数,余数;MQ存储商;X通用寄存器存储除数
商初始为0,逻辑左移,低位补0
计算机默认上商1,如果错了再改上商0,并恢复余数
手算 恢复余数法
余数为正数,商1,直接进行逻辑左移;否则商0,加上余数的绝对值恢复余数,并逻辑左移
若最后一步商余数为负,也需要恢复余数并商0
左移n次,上商n+1次;最后一次上商余数不左移
恢复余数法修改策略:
原码除法:不恢复余数法(加减交替法)
若余数为负,则可直接商0,并让余数左移1位再加上|除数|
过程
符号位单独处理
余数为列式值*2-n n为数值位字长
余数正负性与商相同
若余数为负,需商0,并加y补得到正确余数
算法进行n+1或n+2次,而逻辑左移只需要移动n次
补码除法:加减交替法
补码除法
符号位参与运算
被除数/除数采用双符号位
步骤
被除数和除数同号,则被除数减去除数;异号则加上除数
余数和除数同号,商1,余数左移移位减去除数
余数和除数异号,商0,余数左移移位加上除数
重复n次
末位恒置为1
除法总结
C语言中的强制类型转换(非重点)
无符号数与有符号数,不改变数据内容
改变解释方式
长整数变短整数
高位截断,保留低位
短整数变长整数
符号扩展
数据存储与排列
大小端模式
最高有效字节(MSB)
最低有效字节(LSB)
多字节数据在内存内是占据连续的几个字节
大端模式
将MSB存放于低地址部分,LSB存放于高地址部分
小端模式
将LSB存放于低地址部分,MSB存放于高地址部分
边界对齐
字转换为字节 逻辑左移 *22
浮点数的表示和运算
定点数的局限性:定点数表示的数字范围有限,而我们无法无限制的增加数据的长度
如何在位数不变的情况下增加数据表示范围
科学计数法理解浮点数
阶码:反应数值大小
尾数:反应数值精度
浮点数表示
E 阶码:常用补码或移码表示的定点整数
反映浮点数的表示范围和小数点的实际位置
M 尾数:常用原码或补码表示的定点小数
反映浮点数的精度
改变阶码可以减少尾数舍入从而提高数据精度
尾数给出一个小数,阶码指明小数点要向前/向后移动几位
浮点数真值:
浮点数机器0
如果一个浮点数的尾数为全0,则不论其阶码为何值;
如果一个浮点数的阶码小于它所能表示的最小数,则不论其尾数为何值;
计算机在处理时都把这种浮点数当作“0”看待,称为机器零。
浮点数尾数的规格化
未被规格化的尾数可能影响数值大小,所以需要规格化
尾数最高位为有效位,防止精度丧失
左规:算数左移
当浮点数运算的结果为非规格化时要进行规格化处理,将尾数算数左移一位,阶码减1
右规:算数右移
当浮点数运算的结果尾数出现溢出(双符号位为01或10)时,尾数算数右移1位,阶码加1
采用"双符号位",当溢出发生时,可以挽救。更高的符号位是正确符号位
规格化浮点数的特点
-
原码表示的尾数进行规格化:(最高数值位必为1)
正数为:0.1XX…X的形式,其最大值表示为0.11…1;最小值为0.10…0
尾数的表示范围为:1/2<= M <= (1-2-n)
负数为:1.1XXX…X的形式,其最大值表示为1.10…0;最小值为1.111…1
原码负数最大值小,最小值大
尾数的表示范围为:-(1-2-n)<=M<=-1/2
-
用补码表示的尾数进行规格化:(尾数符号位和最高数值位相反)
正数为:0.1XX…X的形式,其最大值表示为0.11…1;最小值为0.10…0
尾数的表示范围为:1/2<= M <= (1-2-n)
负数为:1.0XXX…X的形式,其最大值为1.0111…1;最小值为1.00…0
补码负数 最小值最小,最大值最大
尾数的表示范围为:-1<=M<=(1/2+2-n)
左移,阶码-1,低位补0;右移,阶码+1,高位看符号
遇到正或负下溢,当做机器0
IEEE754标准
IEEE 754标准32位单精度浮点数N的解释如下:
若E=0,且M=0,则 N为0。
若E=0,且M≠0,则 N=(-1)S·2-126·(0.M)。为非规格化数。
若1≤E≤254,则 N=(-1)S·2E-127·(1.M)。为规格化数。
若E=255,且M≠0,则 N=NaN (“非数值”)。若E=255,且M=0,则 N=(-1)S∞ (无穷大)。
对于绝对值较小的数,为了避免下溢而损失精度,允许采用比最小规格化数还要小的非规格化数来表示。
注意:非规格化数和正、负零的尾数隐含值不是“1”而是“0”。
其中移码=真值+偏置值
偏置值=2n-1-1 范围:-128-127 正常范围为 -126-127
尾数用原码表示
阶码真值=移码-偏移量
短、长浮点数真值确定方式
IEEE754单精度浮点型能表示的最小绝对值、最大绝对值是多少
*最小绝对值:尾数全为0,阶码最小真值为-126,对应机器码为 0000 0001 此时整体真值为(1.0)22-126
*最大绝对值:*尾数全为1,阶码最大真值为127,对应机器码为 1111 1110 此时整体的真值为
(1.11111…1)2*2127
若要表示的数的绝对值还要更小
使用阶码全1或全0
例子们
-
十进制转换为浮点数
-
浮点数转换为10进制
总结
定点数浮点数比较
- 字长相同的条件下,浮点表示的数据范围大、精度高。
- 浮点运算算法复杂,所需设备量大,运算速度慢
浮点数加减运算
十进制科学计数法模拟
浮点数加减运算步骤:
-
对阶
小阶向大阶对齐
好处:计算机内部 尾数是定点小数,小阶向大阶对齐过程中,仅需将小阶数右移,阶码加1
-
尾数加减
-
规格化
第一位为有效位
右规就会面临舍入问题
-
舍入
根据条件,舍弃低位部分
-
判溢出
二进制浮点数加减运算:
浮点数加减运算-舍入
0舍1入法:类似十进制中的四舍五入,即在尾数右移时,被移动的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1。这么做可能使尾数又溢出,此时需再做一次右规。
恒置1法:尾数右移时,无论丢弃的最高数值位是1/0,都使右移后的尾数末位恒置1。该方法同样有尾数变大和变小的两种可能。
强制类型转换
算数逻辑单元(ALU)
算术逻辑运算单元(简称ALU)是一种以加法器为基础的多功能组合逻辑电路。
ALU的基本设计思想:在加法器的输入端加入一个函数发生器,这个函数发生器可以在多个控制信号的控制下,为加法器提供不同的输入函数,从而构成一个具有较完善的算术逻辑运算功能的运算部件。
*ALU:*回顾
*机器字长:*ALU同时能输入多少个bit的信息
ALU多少位,寄存器就多少位
进行基本的逻辑运算
逻辑规律表达
德摩根律
偶数1异或为0
串并行加法器
一位全加器
Ci 来自低位的进位
Ai 被加数的位
Bi 加数的位
Si 本位的结果
串行加法器
仅有一个全加器,数据逐位串行送入加法器中进行运算。
进位触发器用来寄存进位信号,以便参与下一次运算
若操作数长n位,加法就要分n次进行,每次产生一位和,并且串形逐位地送回寄存器
并行加法器
串行进位的并行加法器
把n个全加器串联起来,就可以进行两个n位数的相加
改善并行加法器
运行速度受进位产生和传递速度的影响
结论:第i位向更高位的进位Ci可根据被加数、加数的第1~i位,再结合C0即可确定
并行进位的并行加法器
各级进位信号同时产生,又称为先行进位、同时进位
单级先行进位方式,又称为组内并行,组间串行的进位方式
多级先行进位,又称为组内并行,组间并行进位方式
看不懂辽
串行加法器->串行进位的并行加法器->组内并行,组间串行进位的加法器->祖内并行,组间并行进位的加法器