PC_@BCD码(8421BCD)@定点数加减法@补码减法公式

[toc]

编码

BCD码

  • 用4为二进制数(可以表示 2 4 = 16 2^4=16 24=16种不同的值)来表示10个十进制数0~9
    • 这种编码方法使得二进制数和十进制数可以快速进行转换
    • 容易发现,BCD码中有6中冗余码不代表某个十进制数
8421BCD
  • 有权BCD码
    • 权值从高到低为 8 , 4 , 2 , 1 8,4,2,1 8,4,2,1
    • b 4 b 3 b 2 b 1 b_4b_3b_2b_1 b4b3b2b1代表的十进制数就是按权展开 ∑ i = 1 4 b i 2 i − 1 \sum\limits_{i=1}^{4}b_i2^{i-1} i=14bi2i1
  • 具有的6个冗余码为: 1010 ∼ 1111 1010\sim{1111} 10101111
修正
  • 两 个 4 位 8421 B C D 码 相 加 的 结 果 如 果 不 大 于 9 即 : ( 1001 ) 8421 B C D 两个4位8421BCD码相加的结果如果不大于9即:(1001)_{8421BCD} 48421BCD9:(1001)8421BCD,则不需要修正
  • 否则需要修正:
    • 例 如 : 15 = 6 + 9 = 011 0 2 + 100 1 2 = 111 1 2 例如:15=6+9=0110_2+1001_2=1111_2 :15=6+9=01102+10012=11112
      • 15 = 0001 ‾ 0101 ‾ 15=\underline{0001}\overline{0101} 15=00010101,即,1,5的权分别用一个8421BCD码分别表示
      • 显然1111不是正确结果
    • 修正方法简单,假设某个结果X=A+B落在冗余码区间内的 1010 ∼ 1111 1010\sim 1111 10101111,则对X+6,即可
      • 从16进制的角度(对应4为8421BCD码)来看容易理解
      • 超过9的部分记为T落入冗余区间(跨度为 6 ( = 011 0 2 6(=0110_2 6(=01102)),为了还原T,额外+6来填补冗余区间,还原了T,得到正确结果
      • 上 例 111 1 2 + 011 0 2 = 1010 1 2 上例1111_2+0110_2=10101_2 11112+01102=101012用8421BCD表示(高位补0)得到 0001010 1 8421 B C D 00010101_{8421BCD} 000101018421BCD
BCD转10进制数
  • 不同于按权展开,根据8421BCD的定义,将BCD二进制串从低位向高位每四个一组,分别转换为10进制的数码(0~9)中的一个即可
    • eg. 10100 1 8421 B C D = 2 9 10 101001_{8421BCD}=29_{10} 1010018421BCD=2910

算数逻辑单元ALU

  • ALU是一种功能强的组合逻辑电路
  • 能够进行多种算数运算和逻辑运算
    • 加减乘除都能够归结为加法运算,ALU的核心是带标志的加法器

定点数加减计算

  • 对于定点数
    • 小数点约定在最左边就是顶点小数;
    • 约定在最右边就是定点整数
  • 实际上机器内部没有小数点
    • 因此在运算过程中,可以不考虑是小数还是整数,只需要关心它们的符号数值位

补码加减法运算

  • 不同于原码的加减法,(原码的符号位是单独处理,而不是统一做加法)
  • 补码才可以将符号位和数值位一样做加法

补码加法的基本公式如下:

加法
  • 整 数 [ A ] 补 + [ B ] 补 = [ A + B ] 补 (   m o d   2 n + 1 ) 整数 \quad[A]_{补}+[B]_{补}=[A+B]_{补}\left(\bmod 2^{n+1}\right) [A]+[B]=[A+B](mod2n+1)
    小 数 [ A ] 补  + [ B ] 补 = [ A + B ] 补 (   m o d   2 ) 小数 \quad[A]_{\text {补 }}+[B]_{补}=[A+B]_{补}(\bmod 2) [A] +[B]=[A+B](mod2)
  • 即补码表示的两个数在进行加法运算时,可以把符号位与数值位同等处理,
    • 只要结果不超出机器能表示的数值范围,
      • 运算后的结果按 $ 2^{n+1}$ 取模 ( 对于整数 )
      • 或按 2 取模 ( 对于小数 ) ,
    • 就能得到本次加法的运算结果。
  • 可根据补码定义,按两个操作数的四种正负组合情况加以证明。
减法
  • 记 y = A − B = A + ( − B ) 记y=A-B=A+(-B) y=AB=A+(B)
  • 则对上述三个表达式同时取补码
    • [ y ] 补 = [ A − B ] 补 = [ A + ( − B ) ] 补 [y]_补=[A-B]_{补}=[A+(-B)]_{补} [y]=[AB]=[A+(B)]
  • 由补码加法基本公式,展开可得
  • 整数 [ A − B ] 补 = [ A ] 补 + [ − B ] 补 (   m o d   2 n + 1 ) \quad[A-B]_{补}=[A]_{补}+[-B]_{补}\left(\bmod 2^{n+1}\right) [AB]=[A]+[B](mod2n+1)
  • 小数 [ A − B ] 补  = [ A ] 补 + [ − B ] 补  (   m o d   2 ) \quad[A-B]_{\text {补 }}=[A]_{\text {补}}+[-B]_{\text {补 }}(\bmod 2) [AB] =[A]+[B] (mod2)
小结
  • 符号位和数值位一起参与运算,加/减结果的符号位也在运算中直接得出
  • 最终的运算结果保留最低位开始的n+1位(也就是能够刚好放在寄存器中),而更高位丢弃
补码之间的减法:
  • 此外,还成立:

    • C = A − B C=A-B C=AB

      • C ( C ) = C ( A ) − C ( B ) C(C)=C(A)-C(B) C(C)=C(A)C(B)
      • C ( C ) = C ( A ) + C ( − B ) C(C)=C(A)+C(-B) C(C)=C(A)+C(B)
    • [ A ] 补 − [ B ] 补 = [ A ] 补 + ( − [ B ] 补 ) = [ A ] 补 + [ − B ] 补 = [ A − B ] 补 [A]_{补}-[B]_{补}=[A]_{补}+(-[B]_{补})\\ =[A]_{补}+[-B]_{补}=[A-B]_{补} [A][B]=[A]+([B])=[A]+[B]=[AB]

  • 这里的A,B都是真值.

  • 因此,若机器数采用补码, 当求 A-B 时, 只需先求 [ − B ] 补 [-B]_{补} [B]

  • 由 C ( B ) 求 C ( − B ) 是 容 易 的 , 利 用 规 律 : 由C(B)求C(-B)是容易的,利用规律: C(B)C(B),:

    • 真 值 x 的 相 反 数 − x 的 补 码 C ( − x ) 可 通 过 将 C ( x ) 的 每 一 位 ( 包 括 符 号 位 ) 取 反 再 加 1 得 到 真值x的相反数-x的补码C(-x)可通过将C(x)的每一位(包括符号位)取反再加1得到 xxC(x)C(x)()1
    • 对 于 给 定 的 A − B 算 式 , 通 常 A , B 都 是 正 数 , 从 而 x 的 补 码 和 原 码 相 同 : C ( x ) = T ( x ) 对于给定的A-B算式,通常A,B都是正数,从而x的补码和原码相同:C(x)=T(x) AB,A,B,x:C(x)=T(x)

总结和案例

  • 设机器数字长为8bit(含有1bit符号位)
    • 若A=+15;B=+24;
    • y = A − B y=A-B y=AB;求:
      • C ( y ) = C ( A − B ) ; C(y)=C(A-B); C(y)=C(AB);
      • 并从 C ( y ) C(y) C(y)还原出y真值
  • 分析:主要分为是3~4个步骤(第4个步骤取决于是否要得到真值形式)
将真值用二进制表示
  • A=+15=+0001111
  • B=+24=+(3*8)=+11*1000=+0011000
计算被减数,减数和减数相反数的补码
  • 从真值直接得到对应的补码形式
    • 原码和真值仅相差符号位的表现形式而已
  • C(A)=0,000 1111
  • C(B)=0,001 1000或T(-B)=1,001 1000
    • 这两个用其中一个即可,取决于习惯,用来计算C(-B)
  • C(-B)=1,110 0111+1=1,110 1000
计算C(-B)有3条路🎈
  • C(-B)= C ( B ) ‾ + 1 \overline{C(B)}+1 C(B)+1

    • 无论B是正是负都适用
    • 利用的是真值(X)与真值相反数(-X)的补码间的关系
    • 这里 X ‾ \overline{X} X表示对X所有bit取反(包括符号位一同取反)
  • C ( − B ) = d a t a ( T ( − B ) ) ‾ + 1 C(-B)=\overline{data(T(-B))}+1 C(B)=data(T(B))+1

    • 只有当B>0(-B<0)的情况下适用,
    • 这里 d a t a ( X ) ‾ \overline{data(X)} data(X)表示的是对 X X X除了符号位以外的所有bit(数值位data bits)进行取反
      • X ‾ \overline{X} X d a t a ( X ) ‾ \overline{data(X)} data(X)是不同的(差异在于符号位是否参与取反,后者符号位不参于取反)
    • 利用的是负数的求补方法
  • C ( − B ) = P Q ( T ( − B ) ) = P @ Q C(-B)=PQ(T(-B))=P@Q C(B)=PQ(T(B))=P@Q

    • P @ Q = Z [ 1 : m − 1 ] ‾ @ Z [ m : n ] P@Q=\overline{Z[1:m-1]}@Z[m:n] P@Q=Z[1:m1]@Z[m:n]
    • m表示Z串的最后出现的1的位置
    • n表示Z串的最后一个bit的位置(长度)
    • 位置从高位1开始计数🎈
    • Z = d a t a ( T ( x ) ) Z=data(T(x)) Z=data(T(x))表示T(x)的数值位部分
      • Z串中含有1的时候,Q串至少含有1个bit
      • 否则(Z串中没有1),那么更简单了,说明B=-B=0,C(-B)=0
    • @表示比特串拼接
    • 简写为 C ( − B ) = Z [ : m − 1 ] ‾ @ Z [ m : ] C(-B)=\overline{Z[:m-1]}@Z[m:] C(B)=Z[:m1]@Z[m:]🎈
    • 也即是说,只需要确定m的位置即可
    • 左右法,原理是,某个数的补码可以看做两部分,高部分和反码相同,低部分和原码相同
    • 这是唯一一种不需要末尾加一的方法了
      • 符号位不参于取反,保留T(x)的符号位
      • 虽然看上去形式复杂,但是操作起来却十分便利!
      • 比如说,本例中T(-B)=1,001 **1**000
        • 下线出就是位置m
        • 那么可以直接得出C(-B)=1,110 1000
带入公式:
  • C(y)=C(A-B)=C(A+(-B))=C(A)+C(-B)=0,000 1111+1,110 1000=1,111 0111
  • T(y)=T(A-B)=1,000 1001
按需还原为真值
  • y=-000 1001=-9

手工计算顶点数减法(补码法)

  • 记y=A-B
  • y=A-B=C(C(y))=C(C(A-B))=C(C(A)+C(-B))
  • A=+10010;(18)
  • B=+1011;(11)
  • T(A)=0,10010
  • T(B)=0,01011(在原码对齐位数,后期不易出错)
  • C(-B)=PQ(T(-B))=PQ(1,01011)=1,10101
  • y=A-B=10010-1011=C(C(A)+C(-B))=C(0,10010+1,10101)=C(10,00111)=C(0,00111)=+00111=+111
posted @   xuchaoxin1375  阅读(107)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示