计算机组成原理第二章——数据的表示与运算(中)

本文深入探讨了计算机组成原理中的数据表示与运算,包括逻辑门电路、加法器设计、补码加减运算器的工作原理,重点讲述了奇偶校验码、进位加法器(如串行和并行)、移位运算及其在乘法和除法中的应用。还讨论了原码和补码乘法运算的细节,以及在C语言中的类型转换。此外,提到了数据存储的字节排列方式(大端和小端模式)以及边界对齐的概念。
摘要由CSDN通过智能技术生成

提示:且行且忘且随风,且行且看且从容


前言

2.2.-1 逻辑门电路

基本逻辑运算:与
请添加图片描述

请添加图片描述

请添加图片描述
请添加图片描述
A和B两个输入值先相与然后再取非,图示就是在或门的基础上加一个圆圈。
请添加图片描述
在或门的右端加一个圆圈
请添加图片描述
异或的作用是输入的两个值只要有一个是为1的,输出的值自然也是1
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
这里正好与运算在表达式中是乘法,或运算是加法,所以我们就按照正常的来计算即可。
请添加图片描述

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

在有效信息位的首部或者尾部加上一位奇偶校验位
奇校验码:整个校验码(有效信息位和校验位) 中“1”的个数为奇数个
偶校验码:整个校验码(有效信息位和校验位)中“1”的个数为偶数
其实也就是给定的编码中1的个数, 若是奇校验码,其中有效信息码中1的个数为奇数个,则校验位添加0 若是有效信息码中1的个数为偶数个,则校验位添加1,
偶校验的硬件实现,各信息进行异或(模2加)运算,得到的结果即为偶校验位,然后进行偶校验(所有位进行异或,若结果为1,说明出错,但是若是同时有两个bit发生错误,则进行偶校验也是不能发现错误的)

2.2.1 电路的基本原理 加法器设计

这里主要讲三个部分,算数逻辑单元的作用,大致原理,电路基础知识,加法器的实现,与类似C语言&& 表达式Y=A*B “或”类似“||” 表示式Y=A+B,但是要注意优先级“与”是大于“或”的,同时满足分配律以及结合律如A(C+D)=AC+AD ,再如ABC=A(BC),异或相同是零,相异是一 同或 相同是一,相异是零,与异或正好相反
== 一位全加器两个本位和一个来自低位的进位可以确定本位的和并且也能确定应该向高位进一个什么样的值==
请添加图片描述
串行加法器
只有一个全加器,数据逐位串行送入加法器中进行运算,进位触发器用来寄存进位信号,以便参与下一次运算,如果操作数长n位,加法就要分n此进行,每次产生一位和,并且串行逐位地送回寄存器,所以这张串行加法器的效率较低
请添加图片描述
串行进位的并行加法器
把n个全加器串联起来,就可以进行两个n位数的相加,串行又称为行波进位,每一级进位直接依赖于前一级的进位,既进位信号是逐级形成的,所以这种加法器的快慢取决于每一位进位的速度,例如,当A = 11…11、B= 00…01时,结果输出为S=00…00且Cn=1。由于位数有限,高位自动丢失。
请添加图片描述

本节总览

请添加图片描述

2.2.2 并行进位加法器

上述的时候我们讲过速度很大程度上取决于进位的速度,这里我们可以发现进位的表达式又可以用更低一位的进位表达,这里也就是数学中的递推法 最终我们发现每一级是可以使用C0表示的,也就意味着我们可以直接算出每一个全加器的值,也就意味着每一个进位几乎都是同时产生的,所以这种加法器会快很多,因为每一个进位并行产生,但是这样也有一个缺点就是会导致设计的电路越来越复杂,4位CLA加法器通常是有四个全加器和一些运算逻辑组成,;.
请添加图片描述
为了加快运算速度而采用了快速进位链,即对加法器的每位都生成两个信号:进位信号G和进位传递信号P

2.2.3 补码加减运算器

从硬件的角度来看补码的加减运算是如何实现的,如下图,==若是我们进行的是X+Y 则此时Sub也就是0 此时控制多路选择器Y的值直接通过,若是X-Y此时Sub也就是1,此时控制多路选择器打开1这个开关,而Y也要进行非操作,此时再加上sub 中的这个一,也就实现了减法变加法(全部位取反,末位值加一)==但是无符号数加法器只能用于两个无符号相加,不能进行带符号整数的加/减运算,所以计算机都是将数字以补码的形式存放,若是减法则连同符号位一起取反加一,这样就是负数了,此时再进行相加。

请添加图片描述
请添加图片描述
如下 计算机的底层逻辑在处理加法或者减法的时候是,无论是有符号数还是无符号数都是通过同一个电路来处理的,但是最后我们判断是否溢出的时候,有符号数的判断逻辑和无符号数的判断逻辑是存在显著的区别的
请添加图片描述
请添加图片描述
溢出判断

请添加图片描述
之前看到的说补码是一个环,这里就可以体现,如3+3就是011加011=0110,也就是来到了-2的位置,若是2+2则是010+010=0100也就是来到了-4这个位置,

请添加图片描述
简单来说就是上面的两句话,两个负数的和是正数,两个正数的结果是一个负数。不过这个判溢出的逻辑表达式要记一下
用数学表达式的方式来设计一个逻辑电路,
请添加图片描述
这里的Cs和C1也就是结果的最高位,上溢表示比最大的正数还要大,下溢表示比最小的负数还要小,只有两个负数的和相加是一个正数则表示下溢出,出现这种可能只有符号位相加往前进位,但是若是最高数值位的进位是为1则此时表示的是一个负数,这也不是溢出,只有最高位的进位是0的时候,才是溢出,
并且这一个判断方式也是需要记住的
请添加图片描述
注意这里为什么叫模4是因为第一个符号位是2的一次方,第二个符号位是2的二次方,而模4的意思是任何一个数模4 之后留下来的部分一定是比4小,同理一个符号位称为模2.
所以双符号位不会增加存储的容量
请添加图片描述
并且注意这些判断溢出的方式都是异或,都是结果为1的时候表示成立。

2.2.4 标志位的生成

无符号数加法器只能用于两个无符号数相加,不能进行带符号整数的加/减运算。为了能进行带符号整数的加/减运算,还需要在无符号数加法器的基础上增加相应的逻辑门电路(因为若是无符号加法溢出了发生进位后面8bit是正确的,而有符号数若是发生溢出,机器则会进行不一样的解读),使得加法器不仅能计算和/差,两个nbit的数相加,除了生成一个nbit的值外 同时也会生成四个标志位如下。ALU的基本结构如图2.7所示,其中A和B是两个n位操作数输入端,Cin是进位输入端,ALUop是操作控制端,用来决定ALU所执行的处理功能。例如,ALUop选择Add运算,ALU就执行加法运算,输出的结果就是A加B之和。ALUop 的位数决定了操作的种类。例如,当位数为3时,ALU最多只有8种操作。图2.8给出了能够完成3种运算“与"、“或”和“加法”的一位ALU结构图。其中,一位加法用一个全加器实现,在 ALUop 的控制下,由一个多路选择器(MUX)选择输出3种操作结果之一。这里有3种操作,所以ALUop至少要有两位。MUX是多路选择开关(多路选择器 ),它从多个输入信号中选择一个送到输出端,可通过标志信息来区分带符号整数运算结果和无符号整数运算结果。
零标志ZF=1表示结果F为0。不管对于无符号数还是带符号整数运算,ZF都有意义。
溢出标志OF=1表示带符号整数运算时发生溢出。对于无符号数运算,OF没有意义。
符号标志SF表示结果的符号,即F的最高位。对于无符号数运算,SF没有意义。
进/借位标志CF表示无符号整数运算时的进位/借位,判断是否发生溢出。加法时,CF = 1表示结果溢出,因此CF等于进位输出Cout。减法时,CF= 1表示有借位,即不够减,故CF等于进位输出Cout取反。对于带符号数运算,CF没有意义。

请添加图片描述

请添加图片描述
关于这个进位是不看当前哪个值,只是看有无进位。

2.2.5 定点数的移位运算

移位:通过改变各个数码位和小数点的相对位置,从而改变数码位的位权,可用移位运算实现乘法和除法,原码的算数移位——符号位保持不变,仅对数值位进行移动(也就是山不转水转),
请添加图片描述
请添加图片描述
若是最低位是1 相当于我们舍弃了2-1这样一个精度,
请添加图片描述
左移若是舍弃的不是零,通常是因为超出表示范围了,所以会出现严重误差
请添加图片描述
负数的反码除符号位外与负数的原码正好相反,因此移位后所添的代码应与原码相反,即无论是左移还是右移全部添1。
请添加图片描述
请添加图片描述
其实这些也是可以理解的,原码到反码的过程中有一个是全部取反,自然左边高位是补一,而补码又要加一,自然作用到补码上低位也就是补零,但是做题的时候一定要考虑正数还是负数,正数和原码是一致的
请添加图片描述
请添加图片描述
计算机实现乘法是基于加法以及算数移位来实现的,
逻辑移位将操作数视为无符号数,也就是都是按照正数的处理方式,
请添加图片描述请添加图片描述
循环移位
循环移位分为带进位标志位CF的循环移位(大循环)和不带进位标志位的循环移位(小循环),过程如图所示。循环移位的主要特点是,移出的数位又被移入数据中,而是否带进位则要看是否将进位标志位加入循环位移。例如,带进位位的循环左移,如图(d)所示,就是数据位带同进位标志位一起左移,数据的最高位移入进位标志位CF,而进位位则依次移入数据的最低位。
不带进位位:用移出的位补上空缺,
带进位位,移出的位放到进位位,原进位位补上空缺
注意这里不带进位位的循环左移或者右移 其中进位位中的值都是需要改变的,注意看这里的箭头是双向的,一个低位移出的时候是在CF和最高位都进行移动,不带进位位的循环左移是最高位移出的时候在CF和最低位都进行填充。

请添加图片描述
总结
请添加图片描述
但是要注意这个移位操作不能用于浮点数的,因为其机器数包含了阶码的部分,所以不能简单的整体进行移动实现乘除2的功能,

2.2.6

请添加图片描述

请添加图片描述

2.2.6.1 原码的乘法运算

这节主要讲三个问题,乘法运算的实现思想,原码的一位乘法,补码的一位乘法。
乘法运算的实现思想将乘数拆成多个数相加,再用被乘数分别与这些乘数进行相乘再相加,但是这里考虑到机器实现有三个问题,1,实际数字有正负,符号位如何处理?,2,乘积的位数扩大一倍,如何处理?,3,4个位积都要保存下来最后统一相加?
问题一:符号位单独处理,符号位=A异或B,圆圈里面一个加号就是异或的符号写法
问题二:先加法再移位 重复n次,当前位=1,则ACC加上被乘数,当前位=0,则ACC加上0,每次加完之后进行移位,然后乘积高位往右移动,继续看乘数的乘积低位,为1则用被乘数与乘积高位相加,结果放在乘积高位中,再移动,再继续看乘积低位
问题三:你会发现这里的结果不是每一个算出来然后相加而是一位算出来就放在ACC与MQ中了
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
注意这里ACC和MQ中的红色部分我们称之为部分积,
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
注意:考虑到运算过程中部分积和乘数做加法时,可能出现部分积大于1的情况(产生进位),但此刻并非溢出,为了和补码的乘法进行统一,所以这里原码的乘法部分积和被乘数也取双符号位。
请添加图片描述
原码的乘法使用单符号位双符号位都是可以的,但是因为补码的乘法一定要使用双符号位,所以这里为了统一也是使用双符号位
若是两个整数的乘法,也是一样的计算方式,不过是将小数点变成逗号,另外两个小数相乘小数点是固定在符号位的后面若是整数相乘,小数点固定在上图竖线的位置

2.2.6.2 补码的乘法运算

符号位参与运算,运算的数均以补码表示。
被乘数一般取双符号位参与运算,部分积取双符号位,初值为0,乘数取单符号位。(这里取双符号位是为了移位的时候方便知道填零还是填一,另外就是为了防止溢出
乘数末位增设附加辅助位,初值为0。因为所有的寄存器的位数一般都统一的,同样的也对ACC进行扩展,同样的对通用寄存器X也进行了扩展。
根据辅助位以及乘数的最低位的取值来确定操作
移位按补码右移规则进行。
==进行n+1步操作,但第n+1步不再移位(共进行n+1次累加和n次右移,与原码的移位操作进行的次数是一样的,多的一次累加是符号位),仅根据辅助位与MQ中的最低位的比较结果做相应的运算。
请添加图片描述
如对下图的解析,第一步的时候,辅助位-MQ中的最低位为-1,这个时候加上-乘数的补码(全部位取反,末尾加一),然后ACC和MQ统一右移,符号位不动,数值位右移,正数右移补0 负数右移补1(符号位是啥就补啥),Y5是这里的辅助位,Y4是这里MQ中的最低位也就是辅助位的前一位。,最高位的符号位课本上记为Ys,
请添加图片描述
最后这一次加法其实是和乘数的符号位是有关的,所以我们说在补码的乘法中,乘数的符号位也参与运算,所以最后这一位符号位不参与移动,所以比起原码的要多一次乘,
并且注意写这个题的时候,首先需要将要计算的乘数和被乘数的补码写出来,然后将其中一个数的负的补码写出来,乘数是单符号位,多了一个辅助位,被乘数和乘积高位是双符号位,然后起始的时候辅助位置为0,用辅助位减去MQ中的最低位,若是为1则加上x的补码,然后进行移位,若是0,只移位,若是为1 则加上-x的补码,进行移位,移位的时候需要根据符号位来进行移位。同样的也是先加在进行移位,最后一次加而不进行移位。
知识点回顾
请添加图片描述
注意逻辑右移意味着高位一定是填零,
算数右移:符号位保存不变而高位到底填什么是根据符号位来确定,

2.2.7.1 除法运算

原码的除法运算

如下图ACC中保留的是被除数 ,MQ中保留的是商,通用寄存器中保留的是除数,本来我们的想法是比较ACC与通用寄存器中的值来确定商的值,但是计算机很傻,会先默认商一,若是检查到ACC中的符号位是1(负)此时也就会修改商上面的值让其为0,并且让ACC恢复原样,ACC与MQ整体左移,低位补零,然后依然是默认商1,若是最后一步商余数为负,也需要恢复余数并商零
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
原码的最后一个余数会影响具体到那一步结束,若是余数为正则满足,若是余数为负,则仍然需要恢复余数,
请添加图片描述
注意最后的余数需要乘一个2的-n次方
注意原码的符号位是单独处理的
恢复余数法(手算)
根据所得余数的符号位的正负来确定商应该是0或者1
请添加图片描述
每一步都是先上商,然后再进行移位,移位的目的是为了下一次运行,最后一次不需要在进行下一次了,所以只需要上商而不需要移位,所以移位的次数比上商的次数少一,操作数需要一个数符位来确定正负,根据正负来判断是否需要恢复余数,结果不需要来确定正负,所以结果可以比数值位多进行一次,
请添加图片描述
不恢复余数法(手算)
因为我们通过上一步不恢复余数法的计算,我们知道若是结果是负数,我们是需要恢复余数,然后左移,然后继续是商1 进行判断是否结果为负,这些步骤都是固定的,所以若是结果为负,我们可以直接来到这一步,左移然后加补码得到下一个的余数,若是结果依然是负数,继续右移加上补码,商是为001,这种恢复余数就是自动的将上一步的商确定为0,这一步的商确定为1,
原码不恢复余数法即加减交替法,只在最终余数为负时,才需要恢复余数
请添加图片描述
恢复余数法因为需要根据商来确定是加法还是移位,所以这个加法次数与移位次数也就不确定了,
而不恢复余数法无论结果正负都是移位,加法,并且可能是因为寄存器的位数是一定的,并且不需要符号位所以填满自然需要加n+1次,而加过之后就需要移动为下一次做准备,最后一次不需要再为下次做准备了,所以不需要移动了,但是最后一次可能是负数所以可能需要恢复余数,所以这个加的次数可能是n+2次,
请添加图片描述

请添加图片描述
若是最后一步的余数是负数,也是需要恢复余数的,所以加减的次数可能是n+1次也可能是n+2次,但是逻辑左移只需要进行n次,每一次逻辑移位只是为了下一次的运算,最后一次不需要在进行算了,得到余数即可(切记切记最后为负数的话,需要恢复余数的)。

2.2.7.2 补码的除法运算

补码一位除法的特点是,符号位与数值位一起参加运算,商符自然形成。除法第一步根据被除数和除数的符号决定是做加法还是减法:上商的原则根据余数和除数的符号位共同决定,同号上商“1",异号上商“0"”:最后一步商恒置“1”
补码的加减交替法的规则如下:
1)符号位参加运算,除数与被除数均用补码表示,商和余数也用补码表示
2)若被除数与除数同号,则被除数减去除数。若被除数与除数异号,则被除数加上除数
3)若余数与除数同号,则商上1,余数左移一位减去除数。若余数与除数异号,则商上0,余数左移一位加上除数。
4)重复执行第③步操作n次。
5)若对商的精度没有特殊要求,则一般采用“末位恒置1”法。
请添加图片描述
n位定点数的除法运算,实际上是用一个2n位的数去除以一个n位的数,得到一个n位的商,因此需要对被除数进行扩展。对于n位定点正小数,只需在被除数低位添n个0即可。对于n位无符号数或定点正整数,只需在被除数高位添n个0即可。
请添加图片描述
至于为什么加减少一次,是因为补码加减交替法最后一位使用恒置一法。

2.2.8 c语言的类型转换

C语言中定点整数是用“补码”存储的
所以进行强制转化的时候
无符号数和有符号数:不改变数据内容,改变解释方式
长整数变短整数:高位截断,保留低位
短整数变长整数:符号扩展,(如16位补玛0x8FA0扩展为32位应该是0xFFFF 8FA0)

2.2.9 数据的存储和排列

在存储数据时,数据从低位到高位可以按从左到右排列,也可以按从右到左排列。因此,无法用最左或最右来表征数据的最高位或最低位,通常用最低有效字节(LSB)和最高有效字节(MSB)来分别表示数的低位和高位。例如,在32位计算机中,一个int型变量i的机器数为01 23 45 67H,其最高有效字节MSB=01H,最低有效字节LSB= 67H。
现代计算机基本上都采用字节编址,即每个地址编号中存放1字节。不同类型的数据占用的字节数不同,int 和 float型数据占4字节,double型数据占8字节等,而程序中对每个数据只给定一个地址。假设变量i的地址为08 00H,字节 01H、23H、45H、67H应该各有一个内存地址,那么地址08 00H对应4字节中哪字节的地址呢?这就是字节排列顺序问题。多字节数据都存放在连续的字节序列中,根据数据中各字节在连续字节序列中的排列顺序不同,可以采用两种排列方式:大端方式(big endian)和小端方式(little endian),

大小端模式
小端读取的方式更有利于机器的处理:计算机首先从计算机读入的最低有效字节 这样CUP在处理加法的时候,这样从低有效字节读入是有利于处理的,若是进行两个int型数据的相加,从低位数据加正好复合数据的进位,
请添加图片描述
请添加图片描述
边界对齐
这个东西通常是结构体定义的时候,比如下图我们定义了三个char型变量 三个short型变量,还有一个short型变量,若是按照边界不对齐的方式,我们读取第一个short变量的时候需要两次访问并进行拼接,而上边界对齐则一次访问便可,且不需要拼接,一种空间换取时间的策略,精简指令系统计算机 RISC通常采用边界对齐方式,因为对齐方式取指令时间相同,因此能适应指令流水
请添加图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值