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=1∑4bi2i−1
- 具有的6个冗余码为: 1010 ∼ 1111 1010\sim{1111} 1010∼1111
修正
- 两 个 4 位 8421 B C D 码 相 加 的 结 果 如 果 不 大 于 9 即 : ( 1001 ) 8421 B C D 两个4位8421BCD码相加的结果如果不大于9即:(1001)_{8421BCD} 两个4位8421BCD码相加的结果如果不大于9即:(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
1010∼1111,则对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
-
例
如
:
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
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=A−B=A+(−B)
- 则对上述三个表达式同时取补码
- [ y ] 补 = [ A − B ] 补 = [ A + ( − B ) ] 补 [y]_补=[A-B]_{补}=[A+(-B)]_{补} [y]补=[A−B]补=[A+(−B)]补
- 由补码加法基本公式,展开可得
- 整数 [ 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-B]_{\text {补 }}=[A]_{\text {补}}+[-B]_{\text {补 }}(\bmod 2) [A−B]补 =[A]补+[−B]补 (mod2)
小结
- 符号位和数值位一起参与运算,加/减结果的符号位也在运算中直接得出
- 最终的运算结果保留最低位开始的n+1位(也就是能够刚好放在寄存器中),而更高位丢弃
补码之间的减法:
-
此外,还成立:
-
C = A − B C=A-B C=A−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) 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]补=[A−B]补
-
-
这里的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得到 真值x的相反数−x的补码C(−x)可通过将C(x)的每一位(包括符号位)取反再加1得到
- 对 于 给 定 的 A − B 算 式 , 通 常 A , B 都 是 正 数 , 从 而 x 的 补 码 和 原 码 相 同 : C ( x ) = T ( x ) 对于给定的A-B算式,通常A,B都是正数,从而x的补码和原码相同:C(x)=T(x) 对于给定的A−B算式,通常A,B都是正数,从而x的补码和原码相同:C(x)=T(x)
总结和案例
- 设机器数字长为8bit(含有1bit符号位)
- 若A=+15;B=+24;
- 记
y
=
A
−
B
y=A-B
y=A−B;求:
- C ( y ) = C ( A − B ) ; C(y)=C(A-B); C(y)=C(A−B);
- 并从 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:m−1]@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[:m−1]@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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了