二进制四则运算
定义
位无符号整数把全部位宽用于表示大小:第 位(最低位为第0位)的权是 ,因此它表示 到 之间的全部整数,共 个不同的值。位权与进制记号的由来见进制转换。
| 位宽 | 最大值 | 常见对应 |
|---|---|---|
| 8位 | 1字节 | |
| 16位 | 短整数 | |
| 32位 | 单字(约42亿) |
下文用固定位宽书写, 表示4位二进制数 ;下标2是底数,不属于数值。
加法从最低位起逐位相加,逢二进一:
- :本位写0,向高位进1;
- :本位写1,向高位进1。
所以竖式中每一列的输入是“两个加数位 + 低位送来的进位”,输出是“本位和 + 向高位的进位”,一次最多进1。
性质
加法的位宽与溢出
两个 位无符号数相加,真实和最多需要 位。若真实和超过 ,最高位的进位在 位容器中放不下,被直接丢弃,容器里的结果等于真实和减去 :计数从最大值回绕到0,再继续累加。这像只能正转的里程表,走到全1之后再走一格,显示回到全0。
乘法的移位相加
乘数的每一位只有0和1,所以部分积只有两种:该位为1时,把被乘数抄下来并按位左移;该位为0时,整行为0。把各行的部分积相加即得乘积。
两个 位无符号数相乘最多需要 位才一定放得下,因此在 位容器里直接存放乘积可能被截断。
除法的移位与相减
二进制长除法与十进制长除法相同:每轮把被除数的一位落下来,与除数比较,够除则商写1并减去除数,不够除则商写0。每一位的商只可能是0或1,所以“试商”退化成一次比较。
重复减法可以说明商和余数的含义:余数反复减去除数,能减几次商就是几。实际处理器可采用其他除法算法,不能仅据此判断具体执行代价。
例子
竖式计算 (4位)
-
最低位:,写0进1。
-
次低位:,其中一个是低位送来的进位,写0进1。
-
第三位:,同样写0进1。
-
最高位:,不再产生进位。
结果 ,与 一致。
竖式计算
三行部分积分别对应乘数的低三位;乘数最高位为0,对应的一行全为0,省略不写。写的时候已经按位左移对齐,相加时按列处理即可。
乘积 仍在4位范围内。若乘数更大,部分积会超过4位,需要更宽的容器存放。
长除法计算
被除数 ,除数 。
-
取最高两位: 与除数 比较,,商的最高位取1,余数 。
-
落下第三位:余数拼成 ,,这一位商取0,余数仍为 。
-
落下第四位:余数拼成 ,,这一位商取1,余数 。
商是 ,余数是0。回代 ,与被除数一致。
交互探索
调整两个四位无符号数,比较完整的加法结果与低四位。
四位无符号加法何时产生进位?
改变两个四位数,比较完整结果和四位寄存结果。
正在准备演示…
练习
8位无符号整数能表示多少个不同的值?最大值是多少?
不同值的个数是 。
参考解答
位宽为 时共有 个编码,。
最大值是 。
参考解答
最小值是0,最大值是 。
的结果用4位二进制表示是 (只填0和1,不写下标)。
参考解答
。最低位 不进位,中间两位各产生一次进位,最高位再加上进位得1。
用4位容器计算 ,容器中保存的结果是:
参考解答
真实和是 ,需要5位。4位容器丢弃最高位的进位,只剩 ,即回绕到0。
的积是 (只填0和1)。
参考解答
乘数 只有权为 的那一位是1,部分积只有一行:被乘数左移一位,得 。
用长除法计算 ,商和余数分别是多少?
商是 (只填0和1)。
参考解答
,,。
余数是 。
参考解答
被除数末位是0, 能被 整除,余数为0。