0%

计算机组织与体系结构

image-20220906193405111

1. 整数除法

关于整数除法固有bug的一些解释

固有bug就是结果的余数和除数相等或互为相反数。

对于这个不恢复余数的除法,我其实是有点困惑它的正确性如何成立的。经过一些思考,得出了一些或许可以增进一些理解的解释。首先我们考虑被除数和除数都是正数的情况,按照不恢复余数除法的上商规则,不难得出其实每一位商都会是正确的,因为上商判断时依据的也是新算出来的余数,也就是是否够减。但是最后的余数可能会有偏差,如果最后一步是不够减的,上商为0之后本来应该要在下一步实现恢复的,但是没有下一步了,因此我们要将余数加上一个被除数。两个负数相除的情形是类似的。但是需要注意的是一个负数除以它本身的情形,比如-8/(-8),算的时候我们得到-8 - 1*(-8)= 0,这时候如果看位串的符号位来说是变号了的,应该上商是0,然后余数现在也是0,但是在修正余数的时候由于0和-8符号位不同,要加上一个-8,余数变成-8,这显然是不合理的。对于这种情况需要加一个修正,即如果余数等于除数,那么余数减去除数,商加1。

再考虑不同符号的数的除法,比如 -8/3, 在这里要清楚其实不恢复余数的除法本质上还是恢复了余数,只不过和下一步的试商合在一起了。注意到上商的时候的判断标准和恢复余数的除法是不同的,不恢复余数的除法看的是是否和除数同号,这导致了本来该上 1 的地方现在上了 0,本来该上 0 的地方现在上了 1,相当于取反的效果,因此最后需要修正商,加一,合起来达到了取补码的效果。对于这种情况下余数修正的判断,如果最后余数符号和被除数相同,那么不需要修正,如果变了号,说明最后加过头了,但是没有下一轮来恢复了,这时需要减去一个除数。

但是在不同符号数相除的情形当中仍然有一个 bug,那就是正数除以负数且能整除的情况。比如 -8/2 ,我们会得到结果商为 -3,余数为 -2。试了一下,当被除数为负数,除数为正数,且可以整除的时候会出现这种情况。这时需要加一个特判修正,如果余数加上除数为0,那么商减一余数置0 。

2. 一些单位

我们目前所用的K、M、G、T等都是英文表示方法,分别是Kilo(10^3 )、Mega(10^6 )、Giga(10^9 )、Tera(10^12 )的简写,更大的还有Peta(10^15 )、Exa(10^18 )、Bronto(10^21 )等。

3. 机考注意点

3.1 整数除法固有bug

如果余数等于除数,那么余数减去除数,商加1。如果余数加上除数为0,那么商减一余数置0 。

3.2 原码整数乘法

注意进位参与结果右移。

image-20221210223840600

3.2 浮点数相除

尾数相除时,用被除数加上除数的补码来判断是否够减,如果结果最高位是1就不够减,是0就够减。