“第五十四天” 溢出判断,标志位 ,移位,有问题没有解决 之前说过在运算的时候可能发生溢出,这种情况只会出现在 正正相加 ,负负相加 的时候才会出现前者是上溢,正正加得负,后者是下溢,负负加得正。(减法变成加法,再看) 加减运算&溢出判断: 方法一:利用符号位进行判断是否溢出 假设 a+b=c;a,b,c的符号分别视为as,bs,cs,则将 as与bs与(cs的非)的结果 或 ( as的非)与(bs的非)与cs的结果,最终的到的结果记为v 。如果v为0则表示无溢出,如果v为1则表示溢出。其实就是看看abc三者的符号一样不一样,不过这逻辑实现我可能还想不到,前面半部分用来看负负的溢出,如果前半部分结果为 1 则说明abc应该是 1 1 0,则 数值和结果的符号不一样,就是溢出了,后面半部分就是用来看正正的溢出,和上面一样类比一下就行。 方法二:利用符号位的进位 和 最高数值位的进位情况来判断是否溢出(也就是最前面那两位的进位,这个最前是百十个的百) 当符号位和最高位进位不一样的时候表示发生溢出。 如果最高数值位的进位为 1 而符号位的进位为 0 的时候表示上溢; 如果最高数值位的进位为 0 而符号位的进位为 1 的时候表示下溢; 之前说过,只有正正和负负才会发生溢出,对于正正来说,符号位的进位一定是 0 ,那最高数值为的进位是1,最后符号位就变成 1 了,那就上溢了,负负和这个差不多。 这种方法的实现可以借助逻辑运算 异或 (相同为 0,不同为1). 方法三:采用双符号位,正数的符号位是 00 ,负数的符号位是 11. (这里数据在内存中存储的还是一个符号位,不过在参与运算的时候,会将符号位复制一次) 这种方法的话,如果最后的结果,两位的符号如果最后不一样就表示发生了溢出,01表示发生了上溢,10表示发生了下溢,前面的符号位原本正确的符号位,后面的应该是数值位。 这个也可以使用逻辑运算 异或 来实现 ,不同为 1 表示发生溢出。 双符号位补码又称:模4补码(双符号位 可以表示的数是 00 ,01,10,11也就是 0,1,2,3,模4的余数) 单符号位补码又称:模2补码 ,解释和上面一样。 符号扩展; 如果将短数据变成长数据,如int 的数据扩展成 long 型 对于定点整数的符号扩展:在原符号位和数值位中间添加新位的时候,正数都补 0 ,负数原码补 0 ,反码,补码补 1。 这里我感觉就是原码都是补 0 ,补码按符号位决定补 1/0; 定点小数,定点小数是在最后面添加新位的。而且扩展的方式和整数不一样,注意,定点小数正数都补 0 ,负数的原,补码补的是 0,反码补的是 1.除了反码以外剩下的都补 0 。 标志位的生成:这个感觉图清楚一点 



2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/90628.html
