Skip to content

Lecture 2.2

:material-circle-edit-outline: 约 1048 个字 :material-clock-time-two-outline: 预计阅读时间 3 分钟

Chap 3 arithmetic for computer

3.2 有符号数与无符号数

本章主要是复习数逻的基础内容

阿姆达尔定律!!!

3.1 Introduction

  • Computer words are composed of bits;
    • one word is a vector of binary numbers
    • there are 32bit/word or 64bits/word in RISC-V
    • 32 bits, as a word, contains four bytes
  • Generic Implementation of Arithmetic
    • use program counter (PC) to link to instruction address
    • fetch the instruction from memory
    • the instruction tells what needs to be done
    • ALU will perform the specified arithmetic operations

3.2 unsigned and signed

在有符号数中,最高位所代表的值是- 2^ 31 ,而不是-1

有符号数在计算机中通常用补码表示,我们是不能直接读出其真值的。对其非符号位取补后就得到了符号位+真值的原码。

注意,电脑里面存储的负数的二进制码是补码的形式,人类要阅读需要对其取补以获得原码,是这个意思。

所以有符号数1001到底到底是-1还是-7?得看题目说这是原码还是补码。

有点懵

有的计算机使用补码表示,有的使用原码或反码

前者取补码可得结果,后者取第一位是符号位可得结果

但是,在大多数现代计算机系统中,有符号数都使用补码表示。

什么是真值

真值就是真正的值。将带符号位的机器数对应的真正数值称为机器数的真值。

0000 0001的真值= +000 0001,1000 0001的真值= –000 0001。

原码

就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。

反码

正数的反码是其本身

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反

补码

正数的补码就是其本身

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1

-1 和 0xFFFFFFFF问题

有符号 -1 的二进制表示就是以补码形式表示,即: 0xffffffff ( =2 ^ 31 +2 ^ 30+…+2 ^ 1+2 ^ 0=- 2 ^ 31+2 ^ 31-1=-1)

unsigned (-1)表示无符号整数的最大值 即: 4294967295(二进制全1) 因此,unsigned(-1)=1,111…111(共32个1)。表示unsigned的最大值。 也就是0xFFFFFFFF

3.3 Addition

半加器与全加器

image-20240313123323424

左下角是全加器的简写

ALU

再加入减法

image-20240313123942230

再加入溢出检测

image-20240313124324270

并行输入,串行输出,得到完整ALU

image-20240313124519268

再加一个zero detector

这东西就是看计算结果是不是0, 是为了加速数的比较运算,比较的时候需要先检测数是不是0

image-20240313124458684

用下面这个东西表示ALU,右边列举标准的操作集合

image-20240313124901833

srl = shift right logic,逻辑右移

3.4 Multiplication

image-20240313153611709

由此我们可以设计出简单的电路图与算法:

image-20240313153606326

每次检测乘数的LSB,0就让结果加0,1就让结果加被乘数。然后被乘数左移一位,乘数右移一位

64bit乘法用128bit是因为乘法最大情况会使位数翻倍

显然这玩意儿太大太慢了,用了320bit寄存器

image-20240313153529746

改进一下算法,从移位被乘数改成移位乘积,当然乘数依旧移位。从而得到第二版本的乘法算法。

image-20240313152934040

将每一轮的乘积放入128bit寄存器的左边,然后寄存器整体右移一位,欧克。

这样寄存器大小减少到了256bit

image-20240313154955346

image-20240314083823731

下面是个例子

image-20240314085113654

不过或许我们可以再优化一下,从V1到V2我们实现的实际上是减少同一时间点空闲的寄存器bit,这也是我们优化的思路。

而放乘积的128bit寄存器大部分时间也空着很多bit。

于是,我们可以将乘数一开始放在128bit寄存器右边,与乘积和一起右移。

image-20240314085131212

image-20240314085137054

image-20240314085144230

image-20240314085151089

有符号数乘法

储存符号位,然后转化为无符号数,计算,然后比较符号位

image-20240314085229675

Booth‘s Algorithm

乘数和被乘数1很多的话算的很复杂,如果能够减少1的数量就可以大大优化

于是我们可以凑,加一个数减一个数,将挨在一起的1减少为一个1

image-20240314085608523

image-20240314085614118