算术逻辑单元(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
2
3
4
5
6
int add (int a, int b) {
return a + b;
}
int sub(int a, int b) {
return add(add(a, ~b), 1);
}

后加的1可以由减法标志决定


算术逻辑单元(Arithmetic Logic Unit, ALU)

ALU Subtract

ALU Add

最后加上三个输出端,分别为是否进位,是否是负数,是否为0.

TODO: Make a 8 bit ALU