计算机组成原理(2)[1]:数据的表示和运算基本概念

1.1 进位计数制

进制计算制机器相互转换

古老的计数方法

十进制计数法

为什么习惯 是因为人有10个手指 逢十进一

r进制计数法:

基于八进制的加法是逢8进1!0.4+0.4=1

二进制适合计算机?:

逻辑门电路也是处理二进制的元器件!

进制转换

任意进制转换成10进制

二进制转八进制、十六进制

每三个正好可以表示8种不同的状态!

每三个位为一组,小数点为分界线 不够三位 小数点前在前面补零 小数点后在后面补零!

把这个三位的二进制转换成8进制 说几就填几 但对于16进制来说当结果超过9时 对应成相应的符号!

八进制转二进制

十六进制转二进制

!!!!各种进制常见的书写方式

注意以字母结尾的!!!

十进制转任意进制

注意高位是最后计算出的哪一个!

小数怎末办呢?【乘基取整法】

十进制转二进制 (拼凑法)

如果要得到8进制可以 10进制用拼凑转2 2再转8 三位一组!

真值和机器数

总结:

小数部分 可能没办法在换完进制之后还能精确的表示!!!可能永远撑不到0!

1.2 BCD码

8421码【有权码】

每4个二进制位 对应一个2进制的数符 这四个位置的权重就是8421这样的!

加法运算:

手算:手加然后转换

计算机:会把加数和倍加数丢给ALU算数逻辑单元 算数逻辑单元进行假发运算之后

eg:5+8

落在了定义之外不行的 所以给他+6 进1  6对应的十进制是0110

eg:9+9

直接加是10010 已经超过1111【4位数】 所以应该把 后4位+6 再补上之前得到的高位1

余3码【无权】

每一位没有固定的权值!

2421码【有权码】

权值是2421

规则必须是:0-4的第一位是0 5-9的第一位是1!!!

这样就可以达到统一 ( 如果不规定的话 5会出现两种编码)

总结:

加6修正 强制进一

1.4 原/反/补码的转换

原码很麻烦 只要是运算就用补码算!!!!

计算机的机器字长限制了 :计算机同时能进行多少位的运算,也限制了通用寄存器的长度

原码--反码--补码的转换:

左边箭头是双向的!!! 但是补码转反码:

原码和补码转换(快速)

第一个1 也不变哦宝宝

1.5 原反补码的特征对比

补码的符号位参与运算 所以就多一个负数!

真正的解释可以看下面这个文章 引入的模的概念!!!

为啥八位的计算机可以用补码表示-128_补码表示128-CSDN博客

带符号的整数用 原反补 三个形容!

无符号的整数直接表示就可以!也就是说没有原补反!

特别特别注意的是补码!!!

补码比原码可以多表示一位数字!

把补码最小的一个数转换成原码是不可能的!

补码0只有一个表示方法!

是否溢出?

原码溢出

但补码不会溢出!补码可以多表示一个负数!

1.6 移码

但是原反补码是可以表示小数的,但是移码只能表示整数!

移码也可以多表示一个负数

正好可以对应无符号整数是的0到255

通常会在 浮点数阶码中使用!

各种码基本特性的总结:!!!

机器数对应整数:

练习:

移码的作用会在浮点数中进行学习!

1.7 定点小数的表示和运算

定点整数里的位权是根据距离小数点的距离来决定的!

定点整数和定点小数的区别就是 默认的小数点的隐含位置是不一样的!

原码表示:

定点小数 是用 . 隔开的;

但是定点整数 是用,隔开的 

原码转反 转补:【和定点整数一摸一样】

定点小数的加/减运算【一样!】

定点小数vs定点整数

定点小数可以表示的负数更小 可以小到-1!!!

扩展到离小数点远的位置!!!

eg:

eg1:小数补码的加法运算

一定要注意整数的三个码都是一样的!!!!!!!!!!!!!!!

eg2:-19+[-19]

eg:减法

2.1 奇偶校验码(大纲已删)

发现错误

2bit的时候:

3bit的时候:

本来3bit可以表示 8种信息 但是现在只传输了4种 那么剩那四个 一出现就错 露头就秒.....

eg:

2bit跳变时:会以为是正确的(局限性)

计算机硬件实现--通过异或运算

相同的时候是 0 ;不同的时候是 1

求偶校验位

进行偶校验:

2.2 算数逻辑单元(电路基本原理&加法器设计)

ALU!!!!

电路基础只是【数电】

ALU 算法逻辑单元

控制信号是由控制器的CU发出的!

实例:

控制单元会解析指令的含义!然后发出控制信号

M=1是逻辑运算;M=0是算数运算 s0到s3可以指明是那个运算 占了4bit所以可以支持16种逻辑运算 或者 16种算数运算!

A、B是4bit的数据 F是4比特的输出

机器字长:计算机能同时处理多少个比特的整数运算!==ALU中可以支持同时输入多少比特的信息!

这样ALU有多少位寄存器(x、ACC这些)就有多少位【寄存器的位数就是机器字长!】

最基本的逻辑运算

与、或双目运算符:需要两个操作数 非:单目运算符

与:全是1 才是1(相当于交)

或:有1就是1 (相当于 并!)

非:取反

实现可以通过门电路:

门电路:最基本的逻辑元件

用于实现逻辑运算!

或门:两个数加和>=1时 就是1

非门:右边有一个小圈圈!

复合逻辑

小圆圈表示的就是非!

离散数学的德摩根定理

在概率论中的应用:

异或:

相同是0,不同是1

异或可以根据之前的 与或非 进行复合得到!

同或:和异或是相反的

小姐

小结:

异或实现奇偶校验

实现加法器【异或】

异或:相同为0 不同为1  【描述的其实是结果是1时候的形态】

1 一位全加器:

Si本位和:

化简:

一位小结:

2 串行加法器

串行(xing) 就是 一位一位的+

得到的进位是0 存储在进位触发器里

那么在计算倒数第二列的时候:进的位数 C_{i-1}就存储在 进位触发器里

串行小结:

效率低,因为只能一列一列的算!

3 并行加法器

就可以同时进行两组的加和!

c1会成为下一个加法器的输入信号 ,效率更高

小结:

依赖低位,只有低位形成了高位才能进行!那么他的速度很大程度上取决于 每一位进位的产生速度!

大结:

2.3 加法器的优化--并行进位加法器【no重点】

产生更快的进位:

其实刚开始就拥有的信息!就可算出来了

每一位的进位几乎都是同时产生的不需要等着后面的进位!

缺点:逻辑表达式就是电路设计 继续套娃会导致越来越复杂!

解决:

2.4 补码加减运算器

最低位加上cin的信息!介样列式子

两个加法器串起来:

就可以支持更多位的bit运算!!!【实现位扩展】

比如后四位在第一个 前四位在第二个输入这样!

补码的加减运算

补码运算时:符号位也参与运算!

溢出的时候最高位会被舍弃!

电路实现:

sub这根线根据加/减法 输入0/1

这个0/1 也可以开启多路选择器的其中一条线路!

eg1:有符号数加法

计算的结果 二进制转十进制! 

计算出的结果时补码,补码变原码之后 就是最后的结果了!!!补码的运算结果不是最后的结果!!!!!!

1111转原码就是1001 所以就是-1D

eg2:有符号数减法【是错误的,因为发生了溢出】

减法的实现就是 增加多路选择器和 加/减法控制信号!

eg3:无符号数加/减法

也可i看到x-y虽然也发生了 “溢出”  但是运算结果是正确的!!!!!!【标志位的生成--填坑】

运算是按照一个电路执行的,但是有符号数和无符号数判断溢出的方法是存在显著的区别的!!!

2.5 加减运算、溢出判断、符号扩展

原码的加减运算

绝对值大的减小的 从而获得 结果的绝对值 结果的符号和绝对值大的一样!

原码这么复杂的逻辑用电路实现太难了?!

所以用补码 因为补码的符号位可以参与运算!!!

补码的加减运算

符号位同时参加运算

注意啊啊啊啊:正数的原补码都是一样的!!!!!

补码和移码 正数都一样 负数多一个数!!!

补码加法的溢出判断

因为都会变成补码的加法 所以就就对加法进行溢出判断就ok

注意规律是:正+正 上溢 得到的是负数;负+负 下溢 得到的是正数?

两个异号的数运算只会比绝对值小的那个还小!!所以不会溢出

例子:

当有3个比特位 表示的就是 -4到3

当2+2 时:

对应的是-4 那不对啊 1后边都是0的补码表示的就是最小的那个数  -2^n

但结果的出现 相当于2 向右移动了2格 就得到了-4

3+3 3向右移动了3格就得到了-2!

判断溢出的方法:

方法一【AB符号和预算结果符号】:

离散数学和逻辑表达式里都有这个

(ABC)&&且    (A+B+C) ||或   (\bar{A}) !非

eg1:

v=0无溢出 v=1有溢出

A_s,B_s要一样 才有可能发生溢出!

溢出时S的符号和A不一样!

V的两个部分其实就是对应溢出的两种情况!

计算机硬件上的实现:

看那个逻辑表达式设计电路就可以 因为全是与或非这些运算!

方法二【符号位进位和最高数值进位】:

eg2:

在这个例题里C1数值位进位时1 符号位进位是0  1不等于0 所以溢出!

计算机硬件上的实现:

进行异或运算就可以!

方法三:【两个符号位相等则无溢出 最常考】

使用双符号位!

第一位表示正确的符号应该是 第二位表示实际的符号 不同说明发生了溢出!

eg3:

模4补码的意思就是:位权小于2^2次方的数字保留 前面的舍弃!

模2是一样的意思!

注意双符号位的存储:

多一个bit运算可太麻烦了 没那么傻乎乎的!所以这个方法没有导致存储空间的增大!

怎么避免溢出呢?

符号扩展【避免溢出】

正数前面 小数后面

正数:全是0!!!!

负数:原码:补0 反码补1 补码 左补1 又补0

大结:

 2.5 标志位的生成(加法器的补充)

对上一节的加法器的补充!!

两个nbit的数相加 除了能得到nbit的结果之外 还可以输出四个标识符!

最高位 符号位 次高位 数值位的最高位!

of只有在有符号的加减运算中有意义!

第二个的of=1 但结果是正确的 没有溢出!

eg:CF

cf = C_out和sub【或者C_in】这个信号进行异或!

CF只能适用于无符号的整数!

X+Y时:

eg:C_in  = 0 C_out = 0 CF = 0

所以没有发生进位 没有溢出

X-Y时:

C_in = 1;C_out = 0 则CF = 1

说明在减法的时候发生了借位 ,原来的不够减 就借了一下 当b-a时 a>b时就会出现这样的状况!所以溢出了

小结:!!!!!

OF 对有符号数 =1时发生溢出 【用的上面加法器的方法2】

CF对无符号数 = 1时发生溢出【加法进位就完了 减法借位就完了】

2.6 定点数的移位运算

算数移位【改变位权】

10进制移位【可动小数点】数字不会消失

算数移位的方式可以等价的实现乘法和除法!!!

原码:

原码的算数右移位【定点数】数字会消失...

对于定点数【定的就是小数点】 小数点不能动 因此山不转水转 移动数值位 改变数值位与小数点的相对位置!

当舍弃的位置是0的话 右移之后的值就是原来值的一半;如果舍弃的位置是1 的话 会丢失精度!

原码的算数左移位【定点数】

定点小数是一样的效果

反码:

补码:

也就是说左移就补0 右移就补1!!!!

这样就可以保证左移是*2的效果 右移是/2的效果!

小结:

算数移位的应用:乘法

也就是说计算机实现乘法是通过算数移位进行的!!!

让这三个移动之后的数相加就可以得到最后的答案!

逻辑移位【无符号数的移位】

应用:表示颜色

循环移位

移动的时候循环部位 

带进位位的就是带上 CF!

CF对于无符号数的哦!CF 是C_in[加是0减是1]和C_out的疑惑运算结果!

适合对数据的高字节和低字节进行调换!

从而进行大小端的转换就用的是循环补位!

总结:!!!

2.8 C语言定点整数的强制类型转换

!!!有符号数和无符号数的区别

eg1:有符号数和无符号数

int short 等定点整数时通过“补码”存储的!

所以short 占两个字节也就是说占了16比特!

4321转二进制之后取补码:变成这个 计算机存的就是这个数!

把x的值变成无符号的然后赋值给y y存储的直接就是二进制 因为无符号数没有(原码补码反码的概念!!!!) 所以时直接对应得 也就是说 y的真值就是61215

eg2:int变short【长变短】

c 转二进制 这个是反码 第一位是符号位 1000011010100001
则原码是 1111100101011111
原码对应的结果 符号位1 则是负数  111100101011111的结果是31071

eg3:短边长 符号扩展!

补码的符号扩展:

2.9 数据的存储和排列

大小端模式

H 十六进制 D十进制 B二进制!

注意在这里的0800H是地址 数字越小就是越低的地址 大端存储就是高位在低地址 小端是高位再高地址 小端读的时候要逆着排列一下然后再读!

机器处理的时候相当于一开始读入的是低字节 然后才是高字节!

边界对齐

字节编码

现代的计算机通常是按照字节编址,每一个字节会对应一个地址。

如果结合下面这个图,第一个字节我们可以把它编址内存地址对应的是0,第二个字节对应的内存地址是1,第三个对应的是2,第四个对应的是3。
image.png

现代计算机虽然是按照字节编址,但是通常来说也可以支持按字或者按半字来进行寻址的操作

①按字节寻址

比如一条指令,它可以指明我要访问的是内存里地址编号为 4 的字节。


②按半字寻址

比如我同样可以指定我这次要访问的是编号为 3 的半字。一个半字是 16 个比特



③按字寻址

按字寻址也是类似的原理。

由于每个字占 32 个比特,也就是 4 个字节。

字地址转字节地址:

字地址逻辑左移两位就得到字节地址

这个是按字节编号的:

现在如果要访问编号位2的字地址

2号字它用二进制表示,应该是 10 。

我们把它逻辑左移两位,就相当于在末尾又添了两个0。二进制翻译过来应该是8。

所以  编号位2的字地址 对应的字节地址 编号位就是8!!!

半字转字节:

转换成2进制然后逻辑左移1位!

边界对齐的意义:【不对齐可以剩下存储空间 但是浪费时间!!!!】

这我们还需要强调一个事情,我们每次访存只能读写一个字的内容,一个字我们这儿的一整行,不能跨行读取。


所以基于这种特性,有的计算机会采取数据边界对齐的方式,也有的计算机会采用边界不对齐的方式,也就是下面这种方式。

例子:

在 c 语言里边,char型变量刚好占 1 个字节, short 型的变量刚好占 2 个字节, Int 型的变量占 4 个字节。

如果我定义了一个结构体,这个结构体里边包含了 3 个char型的变量, 3 个 short 型的变量,还有一个 Int 型的变量。

边界对齐:


不对齐:


基于之前我们提到的读写,仿存相关的特性,如果按照这种边界不对齐的方式来存储,就意味着当我们要读出 short 型变量的时候,下边这种方案我们必须进行两次访存

而如果采用上边这种边界对齐的方式来存储,最后只剩一个字节,存不下半字的数据,我们就会干脆把这一个字节给浪费掉。虽然空间上能会有一些浪费,但是当我们要读入 short 型变量的时候,只需要进行一次访存就可以,因为这个变量的所有数据都是存放在这一整个字里边的。如下:


所以这就是边界对齐方式和边界不对齐方式的一个对比。

显然,边界对齐方式它是一种空间换时间的一种策略,虽然我们会浪费某一些空间,但是浪费这些存储空间可以换来更快的仿存效率,所以边界对齐的这种存储策略也是值得的。

1.2 定位数的编码表示

1.3 整数的表示

1.4 C语言中的整数类型及类型转换

2 运算方法和运算电路

2.1 基本运算部件

2.2 定点数的移位运算

2.3 定点数的加减运算

2.4 定点数的乘除运算

3 浮点数的表示和运算

3.1 浮点数的表示

3.2 浮点数的加减运算

3.3 C语言中的浮点数类型

3.4 数据的大小端和对齐存储

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值