写这篇文章源于知乎上一个回答帖,答主说唐朔飞老师的《计算机组成原理》书中对于算术左移(SAL)符号位不变的说法是错的,而且补码没有符号位(sign bit)。我查了些资料,对这两个问题做点解释:
1、算术左移和逻辑左移在X86中拥有相同的操作码(参见https://www.felixcloutier.com/x86/sal:sar:shl:shr),所以x86计算机只有一种左移操作,空缺位都是补0。有一种说法是算术左移会触发算数溢出(arithmetic overflow)而逻辑左移不会,比如说C11中规定无符号数运算不会溢出(结果模与2的n次幂)。所以唐老师书中对移位的解释至少是不符合x86体系的计算机的。那么问题来了,左移位中,由于x86中用补码进行有符号数的运算,所以反码的左移位空缺位到底补0还是补1在运算中根本也不会碰到(估计在用反码进行算数运算的机器里,左移操作确实是补充1),这里我没再去深究;但是书中说的算数移位重要的特点:移位后符号位不变,在左移这里就不成立了。我们回忆一下书中用到算数左移的地方:在有符号数的四则运算里,乘法只涉及右移操作,而除法中对余数的左移,书中说原码在用双符号位(变形补码)表示时,可以使用算术左移,并且强调符号位不变,次高位符号位可被第一位数值位占用。在补码除法中,商的符号位在求商过程中自动形成,所以这里肯定默认使用算术左移。关于这两点说法,前者书中没有举例