算术逻辑单元(ALU)
算术逻辑单元(ALU)
构建一个四位算术逻辑单元,可以实现两个四位二进制数的加减法运算。
减法
一个二进制数字表示如下:
0010
四位可以表示从0~15的十进制数。
若使最高位设置为符号位,0表示正数,1表示负数,那么可以表示从-8~7的十进制数。
则0010表示2.
负数的表示方法有:原码、反码、补码。
- 原码:符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。
- 反码:正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
- 补码:正数的补码是其本身,负数的补码是在其原码的基础上,符号位不变,其余各个位取反,最后+1。
在这里,我们使用补码来表示负数。
补码转换
正数
正数的补码就是其本身。
例如:2 为 $10_B$,则其补码为 $10_B$, 存储时为 $0010_B$。
- 0 为 $00_B$,则其补码为 $00_B$, 存储时为 $0000_B$。
负数
负数的补码为其反码+1。
例如:2 为 $0010_B$,表示-2时,最高位符号位为1,算出其反码为 $101_B$,补码为 $110_B$,存储时为 $1110_B$。
即 $1110_B = -8\times1 + 4\times1 + 2\times1 + 1\times0 = -2$
亦可理解成,在0的最前面补上一个1, 然后减去其绝对值。
例如:3 为 $0011_B$,表示-3时,在0的最前面补上一个1,变为 $10000_B$,然后减去其绝对值,即 $10000_B - 0011_B = 1101_B$,存储时为 $1101_B$。
由此得到,
1 | int add (int a, int b) { |
后加的1可以由减法标志决定
算术逻辑单元(Arithmetic Logic Unit, ALU)
最后加上三个输出端,分别为是否进位,是否是负数,是否为0.
TODO: Make a 8 bit ALU