2.2 定点数的表示与运算

2.2.1 定点数的表示

1、无符号数和有符号数

无符号数:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值

有符号数

  • 真值:该数字的实际值,包含正负;

  • 机器数:用数字表示正负号的二进制数

  • 定点小数:约定符号位后面就是小数点

    • +0.75D = 0.11B

    • -0.75D =1.11B

  • 定点整数:约定小数点在数值的最后

    • +3D = 011.B

    • -3D = 111.B

2、原码、补码、反码、移码

整数的“,”和小数的“.”都是用于表示分割,在计算机中实际不存在

(1)原码

用最高位表示符号位,设 x 为真值,则有:

纯小数的原码:

纯整数的原码(n为整数位数):

(2)补码

  • 正数的补码:补码与原码相同

  • 负数的补码:原码符号位不变,数值位取反,末位加1

  • 当一个正数和一个负数互为补数时,他们的绝对值之和称为模数

    • 类似于时钟,+2 = -10,12为模数

纯小数的补码:

纯整数的补码

(3)反码

  • 正数的反码:反码与原码相同

  • 负数的反码:原码符号位不变,数值位取反

(4)移码

\begin{align} [x_{1}]_{移} &= 2^{7} + 10101\\&=10000000+10101 \\&= 1,0010101 \end{align} \begin{align} [x_{2}]_{移} &= 2^{7} + (-10101)\\&=10000000+(-10101) \\&= 0,1101011 \end{align}

  • 同一个数,补码和移码只有符号位相反

  • 移码大真值就大,移码小真值就小

  • 移码的0唯一

2.2.2 定点数的运算

1、定点数的移位运算

对于r进制而言:

可以与加减法结合实现乘除法。

(1)算术移位

机器码采用有符号数,符号位不参与

  • 正数

    • 空位补0

  • 负数

    • 原码:0

    • 补码:

      • 左移:0

      • 右移:1

    • 反码:1

(2)逻辑移位

机器码采用无符号数,直接补0。

(3)循环移位

2、加减法

补码直接相加即可

先求原码:

则可得补码:

可得结果:

3、溢出的概念和判断方式

  • 大于机器所能表示的最大正数称为上溢

  • 小于机器所能表示的最小负数称为下溢

  • 当两个符号相同的数相加或者两个符号相异的数相减时才会发生溢出。

对溢出的判断有几种方式:

(一)采用一位符号位

  • 若V=0,则无溢出

  • 若V=1,则发生了溢出

(二)采用一位符号位根据数据位进位情况判断溢出

即“模2补码”

(三)采用双符号位

即“模4补码”

正数符号位为00,负数符号位为11。

  • 00:正数无溢出

  • 01:正数有溢出

  • 11:负数无溢出

  • 10:负数有溢出

模4补码存储时仍然为一个符号位,因为正确的表示两位符号位必然是相同的

当送入ALU时,才将原来的符号位同时送入ALU的双符号位中

4、定点数的乘法运算

(一)原码一位乘法

  • 符号位单独处理:乘数与被乘数异或

  • 绝对值相乘

    • ACC存放乘积高位,MQ存放乘数、乘积低位,X存放被乘数

    • 每次看MQ中最低位

      • 为1,ACC加上被乘数

      • 为0,ACC加上0

    • 每次运算后右移一位,高位补0

    • 直到MQ仅剩原符号位,舍去不参与运算

  • 小数点位于ACC第一位(乘积符号位)后

  • 绝对值相乘

    • ACC=00000,X=01101,MQ=01011

      • 1,ACC=0.0000+0.1101=0.1101

    • ACC=00110,MQ=10101

      • 1,ACC=00110+01101=10011

    • ACC=01001,MQ=11010

      • 0,ACC=01001

    • ACC=00100,MQ=11101

      • 1,ACC=00100+01101=10001

    • ACC=01000,MQ=11110,MQ此时仅剩最后一位

    • 结果:0.10001111

  • 修改符号位:1.10001111

(二)补码一位乘法

  • 符号位参与运算

  • 移位相加

    • ACC存放乘积高位,X存放被乘数,采用双符号位补码

    • MQ采用单符号位补码,最后一位为辅助位

    • 每次看MQ中最低位与辅助位

    • 每次运算后右移一位

      • 正数高位补0

      • 负数高位补1

    • 直到MQ仅剩原符号位,再做一次加法,不再移位得到结果

  • 小数点位于ACC第二位(乘积符号位)后

  • ACC=00.0000,X=00.1101,MQ=0.10110

    • 0-1=-1,ACC=00.0000+00.1101=00.1101

  • ACC=00.0110,MQ=1.01011

    • 1-1=0,ACC=00.0110

  • ACC=00.0011,MQ=0.10101

    • 1-0=1,ACC=00.0011+11.0011=11.0110

  • ACC=11.1011,MQ=0.01010

    • 0-1=-1,ACC=11.1011+00.1101=00.1000

  • ACC=00.0100,MQ=0.00101,此时MQ仅剩最后一位原符号位

    • 1-0=1,ACC=00.0100+11.0011=11.0111

  • 结果:11.01110001

5、定点数除法运算

(一)原码恢复余数法

  • 符号位单独处理:除数与被除数异或

  • 绝对值相除

    • ACC存放被除数、余数,MQ存放商,X存放除数

    • 每次先默认商1,ACC-除数

      • 结果为负数,错误,商0,ACC+除数

      • 结果为正数,ACC保持不变

    • 每次运算后左移一位,低位补0

    • 直到相应字长的商全部求出

  • 小数点位于MQ第一位(商符号位)后

例:机器字长为5位(含一位符号位),x=0.1011,y=0.1101,采用原码恢复余数法求x/y

  • 绝对值相除

    • ACC=01011,X=01101,MQ=00000

    • ACC=10110,MQ=00000

    • ACC=10010,MQ=00010

    • ACC=01010,MQ=00110

    • ACC=10100,MQ=01100

    • 结果:01101

  • 加上符号位:0.1101

(二)原码加减交替法

不恢复余数

与恢复余数法相比,当商1结果为负数时

  • 直接将商置0

  • ACC左移一位+|除数|:直接得到新余数

    • 结果为正数:商直接置1

    • 负数:继续

  • 只有最后一位商0时需要恢复余数

例:机器字长为5位(含一位符号位),x=0.1011,y=0.1101,采用原码恢复余数法求x/y

  • 绝对值相除

    • ACC=01011,X=01101,MQ=00000

      • MQ=00000,ACC=11100

    • ACC=10010,MQ=00010

    • ACC=01010,MQ=00110

      • MQ=00110,ACC=11010

    • 结果:01101

  • 加上符号位:0.1101

(三)补码加减交替法

  • 符号位参与运算

  • 移位相加

    • ACC、X,采用双符号位补码

    • MQ采用单符号位补码,最后一位为辅助位

    • 第一步

      • 被除数与除数同号:ACC - 除数

      • 被除数与除数异号:ACC + 除数

    • 对比余数和除数(ACC和X)

      • 同号:商1,余数左移一位 - 除数

      • 异号:商0,余数左移一位 + 除数

  • 最后一位的商恒置为1

  • ACC=00.1000,X=11.0101,MQ=0.0000

  • 同号,MQ=00001,ACC=11.1010

  • 异号,Q=00010,ACC=00.1010

  • 同号,MQ=00101,ACC=11.1110

  • 异号,Q=01010,ACC=01.0010

  • 最后一位固定为1

2.2.3 整数型及类型转换

  • 长整数变为短整数:0x000286a1 --> 0x86a1(截断高位)

  • 短整数变为长整数:符号扩展

  • 有符号数变为无符号数:0xef1f(真值-3421) --> 0xef1f(真值61215)

2.2.4 数据的存储和排列

1、大小端模式

都是对于多字节数据

  • 大端:类似正常阅读方式

  • 小端:倒过来

例:分别用大端和小端模式存储12345678H

2、边界对齐

最后更新于