例 1:#
先写补码。被乘数写双符号位的 和 ,乘数写单符号位:
算系数#
第一步永远是 结尾无脑补一个 0,变成 1.01010。
然后从左向右,依次用右边一位减去左边一位,如下过程:
0-1=-1
1-0=1
0-1=-1
1-0=1
0-1=-1
乘数: 1 . 0 1 0 1 0
系数:-1 . 1 -1 1 -1
列竖式#
和小学竖式一样,列乘法竖式。从系数低位开始,从右向左乘过去: 就写 , 就写 ,每往下一行向左错开一位。
每一行首位数是 1 就往左补齐 1,是 0 就补齐 0。比如 110110 补齐成 111110110。
0000001010
111110110
00001010
1110110
+ 001010
----------
0001101110
然后相加,留头两位作为符号,得到 00.01101110:
例 2:#
算系数#
结尾补 0,变成 0.10110。从左向右,右边一位减去左边一位:
1-0=1
0-1=-1
1-0=1
1-1=0
0-1=-1
乘数: 0 . 1 0 1 1 0
系数: 1 .-1 1 0 -1
列竖式#
还是系数从右到左依次乘过去。遇到系数 那一行直接写一排 0;或者干脆不写下一行直接多错一位就行:
0000001101
11110011
0001101
+ 110011
----------
1101110001
相加,留头两位作为符号,得到 11.01110001:
符号位是 01 怎么办#
01 就是正溢出:结果超出了定点小数能表示的范围。
单符号位的补码小数只能表示 :最小是 1.0000,即 ;最大是 0.1111,即 。 写不出来。
两个数都在这个范围里,乘积的绝对值不会超过 。只有 时乘积正好等于 ,这时溢出。
10 不会出现:10 要求乘积小于 ,必须有一个数是 ,不过 表述不出来。
顺便:原码一位乘#
原码就是符号位加绝对值,比如 的原码是 1.1101。
原码乘法更简单,就是小学竖式:符号位异或,数值部分直接乘,不用补符号位。
例:#
符号:。
数值:
1101
× 1011
--------
1101
1101
0000
+ 1101
--------
10001111
和例 2 是同一道题,把例 2 的补码结果 1.01110001 数值位取反加一,正好也是 1.10001111。