组成原理/系统结构学习003

本文深入探讨了计算机中数据的表示方法,包括数制与编码、校验码、BCD码、ASCII码、汉字编码及各种校验原理。详细解析了定点数与浮点数的表示,以及原码、反码、补码、移码的概念与转换方法。同时,文章还介绍了数据运算的基本原理,如加减乘除、移位操作以及溢出判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机组成原理

第二章:数据的表示和运算

数制与编码

  • 校验码
  • 字符与字符串
  • 进位计数法
  • 相互转换
  • 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. 真值到机器数的转换
  2. 对阶
  3. 尾数相减
  4. 规格化
  5. 舍入
  6. 溢出判断
强制类型转换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值