3.7.5 整数乘法运算
2025年09月26日
3.7.5 整数乘法运算
无符号数的乘法,两个尾数为n位的数相乘,乘积的尾数为2n 位。手算乘法的过程如下:对应于乘数的位,将被乘数逐次左移一位加在左下方。最后将n个位积相加,得到乘积。需要n个寄存器保存位积,需要2n位的加法器。
带符号数乘法可以采用无符号数乘法器实现,只需要取2n位乘积中的低n 位即可。对于n位无符号数x 和y 的乘法运算,结果只取低n位,模为2n。因此,可见若丢弃的高n 位是非0数,则发生溢出。公式如下:
如果无符号数乘法指令能够将高n位保存到寄存器中,则编译器可以根据该寄存器的内容对溢出进行判断。
对应n位带符号数乘法,得到的结果可能会溢出。带符号数乘法运算和无符号数乘法运算一样,也可以根据两个乘数与结果的关系来判断。判断规则为:若满足x≠0且p/x=y,则说明没有发生溢出;否则说明发生溢出。
此外,有的机器使用补码来进行乘法运算。一位补码乘法称为布斯乘法,两位补码乘法称为基4 布斯乘法。例如x=6,y=-6,补码乘法时,得到的结果为11011100,而非00111100。计算机乘法指令本身不能判断溢出与否,因此程序员或者编码器要有相应的判断功能。如果都没有此功能将造成一些问题。例如,在C语言中,若x 为int类型数据,x=65535,则x×x=-131071,可见会出现错误。