定点数加减运算与移位运算 附带数学解释

目录


移位运算

逻辑移位

无符号数的移位称为逻辑移位,移位规则为:逻辑左移,高位丢弃,低位补0;逻辑右移,高位补0,低位丢弃。

如0000100,逻辑左移1位为0001000;逻辑右移1位为0000010

算术移位

有符号数的移位称为算术移位,移位规则为:符号位不变,数值位按规则移位

数值位的移位规则为:

对原码,左移高位丢弃,低位补0;右移高位补0,低位丢弃

对反码,左移高位丢弃,低位补1;右移高位补1,低位丢弃

对补码,左移高位丢弃,低位补0;右移高位补1,低位丢弃

移位规则确定的逻辑:统一对一个数的原码反码补码移位后,得到的原码反码补码表示相同的数(不一定与移位前一样),结合原码反码补码的计算规则,即可明白上述算术移位规则的原理。

可以发现移码有规律:从右往左数遇到的第一个1,其之前补码部分与反码对应部分一致;其之后补码部分与对应原码部分一致。


加减运算

从上一节“各种码的运算”我们已经隐隐感觉到补码对CPU运算的重大贡献,但上一节实质针对的是部分情况讨论,即A-B,且A>B时,补码运算规律:结果符号位为正,数值位为A的补码加上B的补码。

本次讨论更一般的情况。讨论之前,先给出结论:

注意,结果取末n位,运算过程若发生溢出则结果出错;更一般的情况是符号位与数值位一起参与运算,且无论正数负数,整数小数,规则一致,大大简化了很多不必要的电路设计。没有讨论0是因为0可以在一定程度上划给正数的阵营,至少从码的形式上看是没有问题的。

原理隐于下面运算,需要仔细体悟,亲自动手实践:


溢出判断

补码定点加减运算结果是否正确,还得看运算过程是否发生溢出。若发生溢出,运算结果就往往不可信。

溢出判断有两种方法:一位符号位判断溢出两位符号位判断溢出

对n位数值位的补码,溢出原理的理解使用n+1位无符号数,进行范围的划分即可明白,简单一句话:上半部分划给负数,下半部分留给正数,两边分界线为0.

两个数运算,结果溢出就只有两种情况:正数+正数负数+负数

一位符号位判断溢出

符号位相同的两个数补码相加,若结果数补码符号位与原始数不同,则为溢出

两位符号位判断溢出

补码向前扩充一位,进行补码运算,结果取前两位。前两位若不同,则为溢出。

简单总结

无论哪种方法,不发生溢出时,结果数的第一位都代表真正结果的符号位;两位符号位判断溢出的方法中,无论是否溢出,结果数的第一位都代表真正结果的符号位

猜你喜欢

转载自blog.csdn.net/weixin_45792450/article/details/109044468