Lazy loaded image
操作系统
Lazy loaded image定点数运算
Words 2646Read Time 7 min
2024-6-18
2025-4-6
type
status
date
slug
summary
tags
category
icon
password
类型
标签
状态

基本运算部件

运算器由算数逻辑单元(Arithmetic Logic Unit,ALU)、移位器、状态寄存器(PSW)和通用寄存器等组成。其基本功能包括加、减、乘、除四则运算,与、或、非、异或等逻辑运算,以及移位、求补等操作。
  1. 带标志加法器
    1. 无符号数加法器只能用于两个无符号数相加,不能用于有符号整数的加、减运算。
      若要进行有符号运算,需要在无符号加法器基础上增加对应的逻辑门电路,使得加法器能进行相应的工作。下图为带标志加法器的实现电路。
notion image
  1. 算数逻辑单元(ALU)
    1. ALU是一种功能较强的组合逻辑电路,它能进行多种算数运算和逻辑运算。它的核心是加法器。下图为ALU的基本结果:
      notion image
      A和B是两个n位操作数输入端;Cin是进位输入端;ALUop是操作控制端,用来决定ALU所执行的处理功能,它的位数决定了操作的种类。
      一位ALU中,一位加法器用一个全加器实现,在ALUop的控制下,由一个多路选择器(MUX)选择输出三种操作结果之一。

定点数的移位运算

当计算机中没有乘/除运算时,可以通过加法和移位相结合的方法来实现乘/除运算。
对于任意二进制整数,左移一位,若不产生溢出,相当于乘以2(与十进制的左移一位1相当于乘以10类似);右移一位,若不考虑因移出而舍去的末尾尾数,相当于除以2。
  1. 逻辑移位
    1. 将操作数视为无符号整数。逻辑移位规则:左移时,高位移出,低位补零;右移时,低位移出,高位补零。
  1. 算术移位
    1. 需考虑符号位的问题,将操作数视作有符号整数。
      对于有符号整数移位操作采用补码算术移位方式:左移时,高位移出,若移出的高位不同于移位后的符号位,即左移前后的符号位不同,则发生溢出。右移时,低位移出,高位补符号位,若低位的1移出,则影响精度。如:补码1001和0101左移时会发生溢出,右移时会丢失精度。

定点数的加减运算

定点数: 一种用于表示小数的数值表示法,其中 小数点的位置是固定的,不会随运算而变化。
  1. 补码的加减运算
    1. 公式:
      notion image
      补码运算特点:
      • 按二进制运算规则运算,逢二进一。
      • 若做加法,两个数的补码直接相加;若做减法,则将被减数与减数的负数补码相加。
      • 符号位与数值位一起参与运算,加、减运算结果的符号位也在运算中直接得出
      • 最终运算结果的高位丢弃,保留n+1位,运算结果亦为补码。
      notion image
  1. 溢出判别法
    1. 当两个符号相同的数相加或两个符号相异的数相减时才可能产生溢出,如两个正数相加,而结果的符号位却为1(为负),通常有以下三种方法判断补码定点数加减运算的溢出:
    2. 采用一位符号位
      1. 只要参加操作的两个数的符号相同,结果且又与这两个操作数符号不同,则表示结果溢出。
    3. 采用双符号位
      1. 也常称为模4补码。运算结果的两个符号位 , 相同,表示未溢出;两个符号位不同。表示溢出。此时最高符号位代表真正的符号。
        Ss1
        0
        0
        1
        1
        Ss2
        0
        1
        0
        1
        结果
        为正,无溢出
        正溢出
        负溢出
        为负数,无溢出
    4. 采用一位符号位根据数值位的进位情况判断溢出
      1. 若符号位(最高位)的进位 。与最高数位(次高位)的进位 相同,说明无溢出,否 则说明有溢出.
  1. 加减运电路
    1. 已知一个数的补码表示为Y,则这个数的负数的补码为 +1,因此,只要在原加法器的Y输入端加n个反向器以实现各位取反的功能,然后加一个2选1多路选择器,用一个控制端Sub来控制,以选择是将Y输入加法器还是将输入加法器,并将Sub同时作为低位进位送到加法器(做减法时实现末位加1)。
      notion image
      无符号整数相当于正整数的补码表示,因此上图的电路也能实现无符号数的加减运算
      💡
      运算器本身无法识别所处理的二进制串是有符号还是无符号数。
      可通过标志信息来区分有符号整数运算结果和无符号数运算结果。
      集中标志代表的意义:
      • 零标志ZF:ZF = 1表示结果F为0。对于有、无符号数的运算,ZF都有意义。
      • 溢出标志OF:判断有符号数运算是否溢出,它是符号位进位于最高数位进位的异或结果。即根据OF无法判断无符号运算是否溢出。
      • 符号标志SF:表示结果等等符号,即F的最高位。对于无符号数运算,SF无意义。
      • 进/错位标志CF:表示无符号数运算时的进位/错位,判断是否发生溢出。加法时,CF = 1时表示结合溢出;减法时,CF = 1 表示有错位,即不够减。
      P 43
      1. 无符号数大小的比较
      1. 有符号数大小的比较
  1. 原码的加减法运算
    1. 原码: 带符号整数 的二进制编码方式,最高位(MSB)表示符号,剩余位数和真值相同存在“+0”和“-0”两种表示(浪费一个数),
      加法:遵循”同号求和,异号相差”的原则,先判断两个操作数的符号位。具体来说,符号位相同,则数值位相加,结果符号位不变,若最高数值位相加产生进位,则发生溢出;符号位不同,则做减法,绝对值大的数减去绝对值小的数,结果符号位于绝对值大的数相同。

定点数的乘除运算

  1. 定点乘法运算
    1. 特点是符号位与数值位是分开求的,原码乘法运算
      1. 运算分为两步:
        • 乘积的符号位由两个乘数的符号位“异或”得到
        • 乘积的数值位是两个乘数的绝对值之积。两个定点数的数值部分之积可视为两个无符号数的乘积。
        notion image
        具体推导过程见P 44
        由上述分析可知,乘法运算可用加法和移位运算来实现(乘以 相当于做一次右移),两个n位无符号数相乘共需进行n次加法和n次移位运算。原码乘法运算的过程可归纳如下:
        • 被乘数和乘数均取绝对值参加运算,视为无符号数,符号位为
        • 部分积是乘法运算的中间结果,初值 = 0.从乘数的最低位开始,将前面所得的部分加上X×,然后右移一位,此步重复n次。
    2. 乘法运算电路
      1. 下图为32位无符号数乘法运算的逻辑结构图。
        notion image
        在字长为32位的计算机中,对于两个int型变量x 和 y 的乘积,若乘积搞32位的每一位都相同,且都等于乘积低32位的符号,则表示不溢出,否则表示溢出。当×和y都为unsignedint 型变量时,若乘积的高32位全为0,则表示不溢出,否则表示溢出。
  1. 除法运算
    1. 基本原理
      1. 和乘法运算相似但是更复杂。
        n位定点数的除法运算,需统一为:一个2n位的数除以一个n位的数,得到一个n位的商,因此需要对被除数进行扩展。对于定点正小数(即原码小数),只需在被除数低位添n个0可。对于定点正整数(即无符号数),只需在被除数高位添n个0即可。做整数除法时,若除数为0,则发生“除数为0”异常,此时需调出操作系统相应的异常处理程序进行处理。
        notion image
        • 被除数与除数相减。够减则上商为1,不够则上商为0
        • 每次得到的差为中间余数,将除数右移后于上次的中间余数比较。用中间1余数减除数,够减则上商为1,不够为0。如此重复,直到商的位数满足要求为止。
        若是2n为除以n位的无符号数,商的位数为n+1位,当第一次试商为1时,表示结果溢出(无法用n位表示商),如1111 1111/1111 = 1 0001。若是两个 n 位无符号数相除,则第一位商为0, 且结果肯定不会溢出;对于浮点数尾数的原码小数相除,第一次试商为1,则说明尾数部分有溢出,可通过右规消除。
    2. 运算电路
      1. notion image
      若是两个32位int型整数相除,则除了- /-1 会溢出,其他情况都不会溢出。
 
上一篇
屏障
下一篇
Funny programs