唐的《计组》
第234页说:
不论是正数还是负数,移位后符号位均不变,这是算数移位的重要特点。
第236页给出了实现算数左移和算数右移的硬件示意图。第237页给出了用带进位的移位实现算数左移。
袁的教材67页说:
算数左移时,高位移出,低位补0,每移一位,如果移出的高位不同于移位后的符号位,即左移前后符号位不同,则结果溢出。
上面这两种表述其实是不同的。
例如,袁的教材中给出了一个例子:
若x是带符号机器数80 00 00 04H,即1000 0000 0000 0000 0000 0000 0000 0100。
2x = 0000 0000 0000 0000 0000 0000 0000 1000 = 00 00 00 08H (负数左移变成了正数,结果溢出),得到2x的真值为8
而如果按照唐的教材中的描述, 2x应为 1000 0000 0000 0000 0000 0000 1000(负数左移仍为正数,不过由于最高数位移出的是0,所以结果是错误的)。得到2x的真值为-(2^31-8)
分析: 的真值为-(2^31- 2^2), 2x的真值应为-(2^32- 2^3),超过了32位补码可表示的最小负数范围,所以算数左移一位结果肯定不对。
而按照袁的左移算法,左移之后所得2x的真值8与由x的真值计算所得2x的真值-(2^32-8)按照模2运算其实是相等的,如果仅在表示运算结果时机器字长多一位,结果就是没有错误的。按照唐的算法,左移所得2x的真值
-(2^31- 8)与由x的真值计算所得2x的真值看不出有什么关系,只能得出左移结果是错误的结论。
再看一个例子:带符号数x=0110.
按照唐的算数左移算法,2x=0100 按照袁的左移算法2x=1100
同样,如果仅在表示结果时机器字长多一位,袁的左移结果就没有错误。而唐的计算结果仍不对。
所以我认为,应该按照袁的左移算法来进行算数左移 (这是我之前的想法,后来想想应该不是这样)
唐和袁所描述的算数左移不同,可是因为不同的机器(采用不同的指令系统)有不同的算数左移指令吧。
参考文献:
《计算机组成原理》唐朔飞
《计算机组成与系统结构》 袁春风