计算机组成原理
第二章:数据的表示和运算
数制与编码
- 校验码
- 字符与字符串
- 进位计数法
- 相互转换
- BCD码
进位计数法
基数:每个数位所用到的不同符号的个数
(2进制的基数是2 ; 四进制的基数是4 ; 八进制的基数是8 ; 十进制基数是10)
进制转换
看一个例子:
Kn ,Kn-1这些叫做位权
看相互转换
任意进制 转换十进制
十进制转换到任意进制
除积取余,乘积取整
整数部分:
先转换到二进制,那么后面的四进制,八进制,十六进制都是可以使用移位操作来实现的.
小数部分:
它法
(这个方法比较麻烦所以不是很推荐.)
拆分法:
BCD码
- 8421码
- 重点掌握
- 余三码
- 2421码
8421码
方法:一一对应,用四位二进制数表示一位十进制数
范围 0000-1001
1010,1011,1100,1101,1110,1111这六个数是不存在的,不在映射表中.因为它们分别对应10-15.
例子:
十进制的 5 + 8 =13
8421码下 0101 + 1000 =1101 (13), 但是 1101在8421码里面没有这个东西
因为这里是四位二进制,是逢 16 进 1 位, 但是现在要表示十进制的,即逢 10 进 1,原来是 碰见15进位,但是现在就是碰见9进位 所以要主动加 6 (15-9)
即: 0101 + 1000 =1101 1101 + 0110 (6) =1 0011 ( 1 3 (BCD码))
余三码
8421码+ (0011)
就是直接在8421码上加3 (0011)
2421码
改变权值定义(对照8421可以发现)

在ASCII码里,32-126为可印刷字符,之前,之后的都不可以显示,用于控制的
数字是连续的,字母也是连续的.
字符串的存放:
看图理解即可.
汉字的表示和编码:
这里是仅作了解.
校验码
- 校验原理
- 奇偶校验码
- 汉明校验码
- 循环冗余校验码
检验原理
码距:两个合法码字对应位上数字的不同位的个数
码距大一点,容易发现错误
举例理解 :
00,01,10,11 是四个数,作为一组,他们的码距就是1,
但是如果00,11两个一组,那么码聚就是2.
假设传输过程中,00是被发送的,结果中间出了故障,变成了01,那么第一组,就判断不出是否出现故障(即检错),第二组的就可以判断.
检错能力 和纠错能力肯定是前者检错能力更容易些.
奇偶校验,本质上就是增加码距
要注意下方的图片中出现的,是 整个校验码
例子可以看一下:
循环冗余码
看图即可明白:
注意了,这里不能算完就走了,还要检验一遍.
用对应的CRC码校验除以多项式对应的二进制码1101,
结果如果是0,那么就是对的.
CRC校验码检错
即让得到的CRC码去除以 多项式对应的二进制码 ,
看余数,
如果余数是0,那就没问题.
如果余数不是0,那么就分析余数,不为0的那位,修改过来即可,完成纠错
海明码(又作 汉明码)
这里我觉得视频里讲得不是很好,我之前看哈工大老师讲得蛮好的,附上我的笔记链接
定点数的表示运算
- 定点数的表示
- 定点数的运算
无符号数:
没有符号的数
n位无符号数的表示范围是: 0 – 2^n - 1
有符号数
有正负号的数,包含符号位和数据位
正号和负号通过0和1表示出来.
真值
数字真的值,有正负号的值
机器数
保存在计算机中的数(正负号也用1/0表示了)
定点数:小数点事先约定
浮点数: 小数点按照规则浮动
表示法
- 原码
- 补码
- 反码
- 移码
此处必看:
正数的原码,反码,补码都是一样的.即就是它本身
原码表示法
要纠正自己的一些错误的想法:
原码,是一种新的格式,它和数据原本的二进制表达式 不完全相同
比如说:
正数的原码,就是在前面加一个0,(0可以忽略不写,所以表面上看起来正数的原码就是本身)
但,负数的原码 就是 2^n - x (其中n表示这个负数的位数,x表示这个负数)
我们可以理解为 数值上 负数的原码 就等于该负数的相反数加上2^n,那么这个数,其实就是在最前面加了一个1.
这下面的逗号只是作为标识,并不真实存在.
实际上就是用1/0来表示符号位,绝对值是一样的,
整数的原码:
小数的原码:
补码表示法
一个负数加上 模 即可得到该负数的补数.
一个正数和负数互为补数时,它们的绝对值之和即为模数
要减去一个数,就等价于 加上一个数.为了
处理负数想出来这样的一个办法.那加上的是什么数呢?
就是该负数的补数,
补数如何计算?
补数等于 该负数加上 模
也可以说, 该负数的补数等于 模 - 负数的绝对值
插个分界线
要使得1011变为0000
(相当于如何把指针指向3点的针拨回为12)
原码变补码 : 按位取反再加一
补码变原码 : 也是按位取反再加一
求-1的补码:
首先 -1的原码是 1000 0001
反码是 1111 1110
补码是 1111 1111 ( 反码+1 )
关于原反补码举例


------------------------------------------------分界线-----------------------------------------------
综上,
公式计算都是给我们理解一下的,具体使用,还是要用 原码按位取反再加一来得到补码
反码
对于原码反码补码的转换:
移码
移码的存在原因:
不能直观看到二进制数值的大小(相对于补码来说,因为最高位是符号位.)
移码保留了数的大小顺序,数值上越大,移码就越大
(而不是像原反补码前面还有一个符号位,比较烦)
移码的使用:
在真值(不论这个正数是正还是负)的情况下,再加上一个常数(偏置值),通常这个常数使用的是 2^n
可以理解为在坐标轴上向正方形移动了一下.
移码通常用来表式浮点数的阶码.
只有整数才有移码,小数没有.
下方是例题:
关于几个码的对比:
同样的机器数,表示的不同码,数值上是不同的.
观察移码和补码的数值上关系,可以得到 移码的绝对值 + 补码的绝对值 = 2^(n-1)
移码的 +0和 -0是一样,因为移码是从原码来的,原码里面0,就是0.
观察上图,第2行的移码,和第130行,的补码,均表示为-127,
前者是0000 0001
后者是1000 0001
差一个最高位,是不是?
转换就是最高位取反即可得到对方.
---------------见下方图------------------
定点数的运算
重点:
- 移位
- 加减
- 溢出判断
次重点:
- 乘除
- 强制类型转换
移位
算术移位(重点)
- 数据左移变大
- 数据右移变小
- 数据移位,空位填补规则
左移和右移:
- 左移在数据末尾添加
- 右移在数据前面添加(符号位不参与移位)
- 移位时,最高位符号位不参与运算.
- 正数*(不论是原反补码)移位(不论是左移右移)都*是添加
- 负数时, 不论左移还是右移,原码,反码分别添加 0和1
- 负数时,补码左移,末尾添加0,补码右移,高位(信息位最高位)添加
讨论左移,右移的影响
由于字长有限制,比如一个8位的数,左移和右移,都有可能挤掉1
挤掉0,倒是没啥大问题,但是挤掉1,就有问题了.
原码: 符号位 + 绝对值
举个例子
- -53的原码, 表示为 1,0110101 (最高位是符号位,逗号是分隔符)
- -53 左移一位 (表示*2) 1,1101010 (末尾补0) 现在这个值表示 -106 <-------- 没有偏差
- -53 右移一位 (表示除以2) 1,0011010 (高位补0) 现在这个数表示 -26 <-------- 出现偏差
(挤掉最后一位1,因为后面并没有预留出来小数位) - -53左移两位 (表示*4) 1,1010100 (末尾补两个0) 现在的值表示-84 <-------- 出现偏差
应该要表示为-212的,但是这里出现了移位错误,因为移位有两高位挤掉了 - -53右移两位 (表示除以4) 1,0001101(高位补两个0) 现在的值表示 -13 <-------- 出现偏差
应该要表示为-13.25,但是这里出现挤掉了末尾的01
看这几个,会发现,移位的位数多了,就容易出问题的.
原码算数移位,左移丢1,运算出错,右移1,影响精度.
逻辑移位
机器数采用无符号数
- 逻辑左移,高位移丢,低位添0
- 逻辑右移,低位移丢,高位添0
什么意思呢?
1101 1011逻辑左移1位
结果是10110110 最高位移掉不要,最低位添一个0即可.
跟上面不同的就是,没有符号位,
循环移位(仅作了解)
之前大二学习汇编里面就有这个
适合高字节和低字节的数据进行互换.
运算
补码引入就是为了 只有加,没有减(但是功能上是可以实现±的)
上溢:大于机器能够表示的最大正数
下溢:小于机器能够表示的最小负数
两个符号相同的数相加,或者两个符相异的数相减,才会有可能出现溢出
方法有三个,一般第三个比较常用(个人觉得),因为之前老师讲得很多的就是这个.
双符号位的第二位要参与运算的.在浮点数的运算中就有体现
对阶,移位的时候,要将第二位符号位右移
强制类型转换
转换方式:
- 长整数变短整数,高位截断,保留低位
- 短整数变长整数,符号拓展
浮点数的表示
- IEEE 754标准
- 基本格式
- 规格化
计算机没有专门的硬件来表示小数点的
基本格式
-
阶码
- 补码或移码
- 阶符,阶码数值
-
尾数
- 补码或原码
- 数符尾数数值
-
规格化
-
原码规格形式
- 正数0.1xxx
- 负数1.1xxx
-
补码规格形式
- 正数0.1xxx
- 负数1.0xxx
-
定点数:
以适当的形式将比例因子表示在数据中,让小数点的位置根据需要而浮动.
阶码E,尾数M这个对应关系要清楚.
E反应实际位置,M表示浮点数精度.
阶码常用补码或者移码表示
看到a=0,01;1.1001,对应后面的结构.
- 分号之前的是指数,逗号前是符号位,表示这个指数的正负
- 分号之后,1.1001 小数点之前,是符号位,表示负,小数点之后表示数值.这又是一个补码,所以按位取反再加一,即可得到 -0.0111真值
规格化: 规定尾数的最高位必须是一个有效值
数值位第一位必须是1,因为0没有用.(相当于有效数字第一位不能是0, 就比如0.0110 ^ 5 不是科学计数法最好的,而是110^6 )
接下来是讨论范围的:
接下来讨论的是标准
信息就在图中;
重点内容为:
- 第一位是数符
- 阶码用移码
- 短浮点数和长浮点数的 阶码和尾数值分别是多少.
- 偏置值需要怎么使用
- 一个是127
- 一个是1023
- 如何在这个标准下表示真值
- 隐含表示1(1.M那个地方)
- 隐含表示1(1.M那个地方)
浮点数的运算
加减运算
- 真值到机器数的转换
- 对阶
- 尾数相减
- 规格化
- 舍入
- 溢出判断