Skip to main content

2-数组表示和运算

码制

十进制转换任意进制

除基取余法(针对整数)

拿十进制的数除以基数(什么进制就是什么基数),留下余数和商,继续执行除基取余,知道商为0,最后将余数从下向上串起来,得到整数部分。

乘基取整法(针对小数)

拿小数不断乘以基数,取掉最高位(小数点前一位),知道乘积的结果为1.000....,将结果从下向上串起来即可。 IMG_20231018_151106.jpg

原码

机器数的最高位表示数据的符号,剩下的数据位表示数据的绝对值真值。假设字长为n+1位。 则小数表示范围:(12n)x12n-(1-2 ^{-n})\le x \le 1-2^{-n}, 整数表示范围:(2n1)x2n1-(2^{n}-1) \le x \le 2^n -1。 其中原码的0有两种表示:10000和00000。

补码

基于原码的不方便运算二设计的,模二运算。正数的补码和原码一样,负数的补码是在原码的基础上,除符号位外取反,末位加1(从右到左找到第一个1,前面的数取反即可)。如果是从x的补码求-x的补码,也是上述的步骤,同时将符号位进行变换即可。 对于字长n+1位。 小数表示范围:1x12n-1 \le x \le 1-2^{-n} 整数表示范围:2nx2n1-2^n \le x \le 2^n -1 零的表示唯一,都是0.000

反码

正数的反码同原码,负数的反码等于原码的数值为全部取反。其中反码的零也有正负之分。

移码

移码常常用来表示浮点数的阶码,理解为在真值上加上一个常数(偏置值),通常是2n2^n,相当于x在数轴上正向偏移若干单位,移码等于补码的符号位取反。 移码的零表示唯一。

移位

算术移位

码制添加
正数原、补、反0
负数0
左1
右0
1

逻辑移位

无脑0

循环移位

IMG_20231018_154216.jpg

定点数加减

运算步骤

原码加减计算在计算机中容易失误得不到正确的结果,于是计算机内部的加减运算都是采用补码进行运算的,减法的本质是加法,等于加上一个负数的补码。步骤:

  1. 按二进制规则,逢二进一
  2. 加法:直接相加;减法:减数转换成负数补码后和被减数相加
  3. 符号位和数值位一起参与运算,加减法的符号位在运算中直接得到
  4. 最终运算结果的高位丢弃,保留n+1位,运算结果还是补码

四个标志

  • 零标志ZF,ZF为1代表全0
  • 溢出标志OF,为1表示溢出,对于无符号数这个标志没用
  • 符号标志SF,表示结果的符号
  • 进/借位标志CF,对无符号有用,有符号数的运算没用

溢出判别

1)一位符号位 参加运算的两个数符号相同,结果与原操作数不同的话,表示溢出。 V=AsBsSsˉ+AsˉBsˉSsV = A_sB_s \bar{S_s}+\bar{A_{s}}\bar{B_{s}}S_s 逻辑表达式为1时候为溢出

2)双符号位 模四补码,运算结果两个符号位一样则不溢出,否则是溢出。

  • 00
  • 11
  • 01上溢出
  • 10下溢出

3)一位符号位 采用一位符号位结合仅为情况判断溢出,若符号位进位CF和最高位数位的进位C1一样表示没有溢出,反之溢出。

定点数乘除

原码乘法

  1. 符号位单独运算,被乘数和乘数按绝对值进行运算
  2. 初始ACC里面设置为00.0000(00符号位隐藏)
  3. 乘数最低位为1,则加上被乘数,为0则加0
  4. 执行完3后,整体带上ACC的符号位进行右移(逻辑)
  5. 重复执行加法和右移n次即可

手算模拟:image.png

补码乘法(booth算法)

在乘数后面初始加一个辅助位0,根据辅助位和乘数的最后一位的加减结果判断下一步加什么。

  1. x和y计算出对应的x和y的补码以及-x的补码
  2. 初始ACC设置00.0000,MQ中为乘数,乘数后添加一个辅助位(辅助位就是MQ后一位)
  3. 辅助位-MQ最低位:为1则加x的补码,为0则加0,为-1则加-x的补码
  4. 执行3后,整体右移(逻辑)一位
  5. 整体执行3和4共n次,最后再执行一次3,但是不右移(也就是n+1次累加和n次的右移)

image.png 比较: image.png

原码除法(恢复余数)

  1. 符号位单独运算
  2. 计算x、y的绝对值,y的补码和-y的补码
  3. **第一步是用被除数-除数的补码 **
  4. 判断余数,余数为负商0,并且加上除数的补码,余数为正商0,不恢复
  5. 执行完4后,余数进行逻辑左移
  6. 加减n+1次,左移n次

流程图: image.png

原码除法(加减交替发,不恢复余数法)

由余数和除数的符号共同决定,不需要恢复余数。

  1. 符号位单独运算
  2. 计算x、y的绝对值,y的补码和-y的补码
  3. 被除数减去除数,判断余数正负
  4. 余数为负,商0,余数左移并且加上除数;余数为正,商1,余数左移并且减去除数
  5. 加减n+1次,左移n

image.png

补码除法(加减交替法)

  1. 符号位参与运算
  2. 计算x、y的绝对值,y的补码和-y的补码
  3. 第一步:被除数和除数同号,则被除数减去除数,被除数和除数异号,则加上除数
  4. 判断除数和余数是否同号,同号商1,余数左移减去除数;异号商0,余数左移加上除数
  5. 执行4操作n次,最后一步恒置1,“末位恒置1”

浮点数

浮点数的表示格式

表示为:N=(1)SMREN =(-1)^S * M*R^E S的取值决定正负;M表示尾数,R是基数(2,4,8...),E是阶码,表示2E2^E

规格化

  • 正数:0.1xxxxx
  • 负数:1.1xxxxx
  • 对于基数为2的,要求小数点后一位不全为0,也就是要为1
  • 对于基数为4的,要求小数点后两位不全为0

策略:

  • 左规:尾数左移,则阶码要-1
  • 右规:尾数右移,阶码+1

IEEE754标准

小概念

符号位:1;阶码:8;尾数:23 其中尾数前面隐含了一个1.,所以尾数的精度是24,能表示24位有效数字

符号S(31)阶码E(23~30)尾数M(0~22)

1+8+23组合。IEEE754标准表示成浮点数真值为:(1)S1.M2E127(-1)^S *1.M*2^{E-127} 其中注意阶码E是移码表示的。 阶码的全0和全1:

阶码符号尾数
全0000
全010-0
全100正无穷
全110负无穷

浮点数的加减运算

给定两个数,先转化成二进制表示形式。

  1. 对阶,两阶码相减,小的向大的对齐,阶码对齐过程中尾数也会进行移动
  2. 尾数加减(符号参与运算,一般都是两位符号)
  3. 将尾数规格化:正数0.1xxx,负数1.1xxx,规格化过程左移或者右移要进行阶码的改动
  4. 舍入:0舍1入、末位恒置1、截断
  5. 溢出判断

溢出的两种情况:

  1. 右规和尾数舍入,尾数大的舍入时候,末位加1,可能导致尾数溢出,此时会进行右规调整,但同时会影响到阶码,导致阶码溢出。
  2. 左规,进行左规时,阶码减1,可能导致下溢

结合一个例题: image.png

image.png