计算机组成原理笔记(第二章 2)
这一节包括定点数的表示和运算:
无符号数:
其实c语言都学了
1-2的负2次方其实就是当k-1=1=k-2=1 这时候 是0.5+0.25=0.75
下面学习有符号数的相关表示法
原码:
很好懂
补码:
如果 我们想把1011变成0000 我们首先可以让1011-1011
但是在计算机内部 还有一种思路 我们想把减法变成加法 如果 寄存器是4位 那么从右往左数第五位一定会背舍去
根据这个思路
我们可以让1011加上它的补数 得到10000 到时寄存器自然舍去这个1
补码求原码还是按位取反再加一
小数也是按位取反再加一:
补码的运算:
还是电子科大的课件讲的详细 吹一波
反码就是按位取反:
移码:
不懂这个课件怎么搞的 按理说不应该是2的n-1次方么 可能这个n不算符号位吧那就
看看人家电子科大的:
就是2的n-1次方啊 谁会蠢到用n像王道考研一样表示总位数-1????
补码符号位取反就变成了移码
这个移码讲的很清楚:
回顾一下定点数的表示:
下面进入定点数的运算;
红色的是考试重点
移位运算:
位运算 太简单了
算术移位:
很简单
循环移位 考试不怎么考 了解就好 但是在密码学什么的应用还是有的:
加减运算:
加减我们统一为求补码再相加
我们可以先求原码再填充0再求补码
也可以先求补码再填0
这个原码怎么加减还是没说啊 我是服了 实际上有符号数的原码加减运算需要细讲一下的啊
看一下电子科大的课件:
一看就懂了...
来个例子更懂了:
香
不过这个例题没有包含最高位有进位的情况 还有就是这些情况大不了考试转化为十进制再算 没人会管我是怎么算出的 干嘛非用补码
这个是移码的加减运算:
来看看例子:
这个-7的移码怎么算的呢 我觉得是这样:
-7 = 1111 移码是要1111+ 01000 需要给1000前边一个0这个符号位 也就是1000-111这个运算 结果为 0001 这个方法是二进制的减法
用补码解释:
1000 -0111=1000+1001=0001
实际上十进制来做题 就是8-7 =1=0001
我上述用了三种方法 实际做题我推荐直接一眼看出十进制然后就这么计算 也好理解 也不可能错 (小学10以内加减法罢了)
溢出判断:
第一种方法 如果发生溢出 符号位会变化;
剩下的判断方法:
下面看看乘法:
乘法不是重点 可能因为计算太麻烦
王道讲的还是不全面 因为还需要一个寄存器存放被乘数 不能光ACC和MQ两个寄存器 我们计算每次累加要么加0要么加被乘数的 而且值得注意的是 这个原码一位乘法 在计算机内部是两位符号位这么算的
也就是00表示正,11表示负
对比下电子科大:
过程很明白 箭头是右移
如果是手工算 就跟十进制差不多 注意一下符号位只表示正负
如果是计算机算(像右侧一样)
如果MQ最后一位是1 加上原值 如果是0 加0
然后ACC和MQ都右移 然后这样迭代计算
直到MQ都移出了如题目中的1011 这个还是很好理解的
但是
补码一位乘法: 这个讲的根本不是很好 迷迷糊糊 小数点莫名其妙 符号位也莫名其妙 最后算法的结束讲的也不清楚
问题太多就比如
为什么机器字长是五位(包括一位符号位) 最后ACC和MQ这些寄存器成了6位的???
x是-0.1101 有符号位 那么填一个符号位 x是11.1101这个没问题吧 x和-x的补码也没问题 可为什么到了y这里 y是正的0.1011 然后y的补码是它本身 不需要添符号位 y是00.1011么?
最后MQ存的为什么是010110?
为什么把0110移出去之后就停止运算?
为什么最后结果舍去后两位 只要ACC和MQ的前四位:
为什么得到这个结果小数点不明不白?
我哪知道小数点要加在哪里?最后还是发现摆脱不了念PPT
估计本身讲课的人也不懂 还需要自己以后大复习查漏补缺的时候去探究,就很烦
补码一位乘法现在还是不太会 但是我想先学完全部再回过头抓难点
乘法运算总结回顾:
然后看一下除法:
手工计算的话:本身就是除不尽的 机器字长五位 我们就保留住五位不除了
如果是计算机算的话:
首先 举个例子 24÷8=3,其中24是被除数,公式是被除数÷除数=商 我经常忘 因为小学老师也教得不好 而且记住这个也没意思
我们要想除以一个数 肯定是一般被除数要大于除数 我们一目测比较最高位就看出来了 但是计算机不能这么目测(或者说底层那些原件的实现不能这样 确实可以写一下相关算法 依次去取最高位来比较除数和被除数大小)
计算机更简单粗暴是 我让被除数的绝对值减去除数的绝对值 (因为要考虑正负 也就是符号位)如果这个差值 大于0 说明被除数天生就比除数大 因为是二进制除法 我们需要商1 如果
这个差值小于0 也就是被除数天生小于除数 我们就商0 除不够 然后再左移补0迭代下来接着除
而用到的这个判断方法需要减法 计算机的减法其实是加他的的补码再舍去溢出位 所以要求出补码
而我们进行减数这个判断除数和被除数大小时(也就是加补码) 寄存器存储了结果 我们需要把结果再还原 所以我们又要加上正的数的补码来还原 这个就是“原码恢复”
这其中我们想“恢复”的次数不固定 我们不知道什么时候要商0
然后我们通过代数学 得到了不用恢复的办法:
然后计算机内部是这样
我就纳了闷了 上次也是机器字长五位 这次也是机器字长五位 上次寄存器6位 这次你给整个5位?什么意思 到底会不会...到底哪个对...怪不得每年都有这么多考研专业课过不了百的
这就像考研不挂科的猴博士一样 永远只教固定的套路 如果不清楚原理 题目灵活一点 一样也什么不会的
那个小数点 结果什么的 到现在我也迷迷糊糊 听完这节课之后我就去淘宝买了课本 而且这种课例子太少了 就这么一种情况 改天考试出个负数除正数什么的 不就又傻眼了么
不懂原理不理解 只按照这种辅导机构的套路做题 真的害人不浅的 我以为能把原理什么的讲的方方面面很全面 其实最后还要自己吃透课本去理解
这也能侧面说明这些考验网课动辄几千价位 其实很不值得 即使花这么多钱也不会讲的多清楚 幸好b站这个是免费的 我从没花钱买这些网课
这个的符号位不参与运算
下面讲的这个符号位参与运算:
总结;
强制类型转换 讲的还可以:
无符号数和有符号数的转换就是原本的内容都不变 符号位的意义会改变 所以真值也会可能变
长整数变短整数 就是比如4字节变为2字节 最高位的那两个字节直接截断不要 剩下两个字节作为short型
短整数变为长整数是符号位的扩展 填充使得位数边长
但是其实int也不一定非要是4字节 这个是看编译器的...总有人说int4字节 其实都是不严谨的说法