编码 & 8421BCD 码的故事

编码 & 8421BCD 码的故事计算机编码中 我们都是先了解了二进制 其中分有符号数 无符号数 然后会接触到 BCD 码 那么 BCD 码是怎么产生的 为什么又要用四位二进制来表示呢 一 BCD 码 1 由来计算机使用二进制数来处理信息 但是如果二进制的形式输入和输出数据 就十分不方便了 一般来说 输入输出时采用十进制数 举例 明明二进制 0110 B 代表数字 6 但是人们更习惯 也更喜欢的数阿拉伯数字 6 也可以是中文六 那么 这里就存在一个问题 我们使用计算器 是输入的为十进制数 25 但是计算机使用二进制数来处理信息 那

计算机编码中,我们都是先了解了二进制,其中分有符号数,无符号数,然后会接触到BCD码,那么BCD码是怎么产生的?为什么又要用四位二进制来表示呢?

一、BCD码

1.由来

计算机使用二进制数来处理信息,但是如果二进制的形式输入和输出数据,就十分不方便了。一般来说,输入输出时采用十进制数。

在这里插入图片描述如图,看出,计算机处理人类的计算,需要多两步的转换。那么,计算次数越多,这损失的效率越大。
那么怎么解决?

前人想出了,一种比较适合十进制系统的二进制编码的特殊形式,即将1位十进制的0~9这十个数字分别用4位二进制的组合来表示,在此基础上可按位对任意十进制数进行编码。

2.8421BCD码

BCD英文是 Binary-Coded Decimal ,二进制编码的十进制。直接明了。

BCD码有很多,例如格雷码,余三码,但用的最多的8421BCD码。

8421BCD码,因为代码中从左至右看每一位“1”分别代表数字“8”“4”“2”“1”,故得名8421码。其中每一位“1”代表的十进制数称为这一位的权。因为每位的权都是固定不变的,所以8421码是恒权码。

在这里插入图片描述

压缩BCD码与非压缩BCD码的区别

  • 压缩BCD码的每一位用4位二进制表示,一个字节表示两位十进制数。例如B表示十进制数96D
  • 非压缩BCD码用1个字节表示一位十进制数,高四位总是0000,低4位的0000 ~ 1001表示0~9.例如00001000B表示十进制数8.

表示: 246 (D)
0010 0100 0110 (8421BCD)

3.修正

需要说明的是,虽然BCD码可以简化人机联系,但它比纯二进制编码效率低,对同一个给定的十进制数,用BCD码表示时需要的位数比用纯二进制码多,而且用BCD码进行运算所花的时间也要更多,计算过程更复杂,因为BCD码是将每个十进制数用一组4 位二进制数来表示,若将这种BCD码送计算机进行运算,由于计算机总是将数当作二进制数来运算,所以结果可能出错,因此需要对计算结果进行必要的修正,才能使结果为正确的BCD码形式。

在这里插入图片描述
我们都知道,38 + 49 = 87 ,其BCD码是 1000 0111
结果是错误的。其原因是,十进制数相加应该是“逢十进”,而计算机按二进制数运算,每4位为一组,低4位向高4位进位与十六进制数低位向高位进位的情况相当,是“逢十六进一”,所以当相加结果超过9时将比正确结果少6,因此结果出错。解决办法是对二进制加法运算结果采用“加6修正”,从而将二进制加法运算的结果修正为BCD码加法运算结果。




BCD数相加时,对二进制加法运算结果修正的规则如下:

  1. 如果两个对应位BCD数相加的结果向高位无进位,且结果小于或等于9,则该位不需要修正;若得到的结果大于9而小于16,则该位需要加6修正。
  2. 如果两个对应位BCD数相加的结果向高位有进位(结果大于或等于16),则该位需要进行加6修正。

因此,两个BCD数进行运算时,首先按二进制数进行运算,然后必须用相应的调整指令进行调整,从而得到正确的BCD码结果。

同样使用BCD码的优点也显示出来了,基于同一个加法器,只需要增加一个修正电路,就能简化二进制和十进制的转换。利于人机交互。

二、底层验证修正计算

计算机到底有没有对于BCD码修正呢?我们使用汇编语言来一探究竟。

1.无修正计算

我们再以 7+8为例。

 jmp start db 8 db 7 start: mov al, [102h]//将地址为[102h]存储的数(8)复制到AX寄存器的低八位 mov bl, [103h]//将地址为[103h]存储的数(7)复制到BX寄存器的低八位 add al, bl //两数相加,结果保存在al上 ret 

运行start前:

在这里插入图片描述
mov al, [102h] // 将地址为[102h]存储的数(8)复制到AX寄存器的低八位

在这里插入图片描述mov bl, [103h] // 将地址为[103h]存储的数(7)复制到BX寄存器的低八位

在这里插入图片描述
add al, bl //两数相加,结果保存在al上

在这里插入图片描述
同时:
在这里插入图片描述




ret //返回

计算机对于7 和 8 就是看成无符号的二进制数。进行相加,结果也就是 0000 1111

2.有修正计算

DAA(daa)是关于BCD码的调整指令
在add指令后增加daa

原因: 加运算,通常采用两种方法 : 一种是在指令系统中设置一套专用于BCD码运算的指令: 另一种是利用二进制数的运算指令算出结果,然后再用专门的指令对结果进行修正(调整),使之转变为正确的BCD码表示的结果。8086/8088 指令系统所采用的是后一种方法。
在这里插入图片描述

未修正时:
在这里插入图片描述
开始修正:




在这里插入图片描述
确实存在修正操作。而且此时AX寄存器的低八位 存储的是 0001 0101 。转成8421BCD码来读就是15。

7 + 8等于15。

总结:
创造一个东西,从来不是完美的。就像没有完美的代码。
但不断改善与优化我们创造的,就是一种完美。





笔者水平有限,目前只能描述以上问题,如果有其他情况,可以留言,有错误,请指教,有继续优化的,请分享,谢谢!
本篇文章是否有所收获?阅读是否舒服?又什么改进建议?希望可以给我留言或私信,您的的分享,就是我的进步。谢谢。


2020.9.16 网安院2楼

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/224210.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午12:27
下一篇 2026年3月17日 下午12:27


相关推荐

  • bm3d算法matlab,BM3D算法实现图像降噪.doc[通俗易懂]

    bm3d算法matlab,BM3D算法实现图像降噪.doc[通俗易懂]BM3D算法实现图像降噪广东工业大学《数字图像、数字信号处理及应用》实验报告题目图像处理综合实验院、系(部)自动化学院专业及班级学号姓名日期目录《数字图像、数字信号处理及应用》0实验报告02实验要求43实验设备44实验原理44.1利用拉普拉斯算子实现图像锐化44.2利用分段线性函数实现对比度扩展54.3余弦变换(D…

    2022年6月2日
    31
  • C++中,结构体vector使用sort排序[通俗易懂]

    C++中,结构体vector使用sort排序[通俗易懂]一、遇到问题:今天写代码的是遇到想对vector进行排序的问题,隐约记得std::sort函数是可以对vector进行排序的,但是这次需要排序的vector中压的是自己定义的结构体(元素大于等于2),想以其中某一个元素进行正序或逆序排序,则不能直接使用sort函数。二、解决方案:在网上找资料的过程中,看到http://blog.csdn.net/aguisy/article/d

    2022年10月20日
    4
  • java中的stringbuffer是什么_java string类

    java中的stringbuffer是什么_java string类之前回答过这个两个的区别,直接拷过来,希望对你有所帮助!关于这两个类,文档里面列的很明确了,注意养成经常查文档的好习惯!话不多说开始:区别一:在Java中字符串使用String类进行表示,但是String类表示字符串有一个最大的问题:“字符串常量一旦声明则不可改变,而字符串对象可以改变,但是改变的是其内存地址的指向。”所以String类不适合于频繁修改的字符串操作上,所以在这种情况下,往往可以使用…

    2026年2月9日
    6
  • Nano Banana×Lovart的5大「邪修」玩法!掌管P图的神

    Nano Banana×Lovart的5大「邪修」玩法!掌管P图的神

    2026年3月15日
    2
  • CockroachDB_DB商城

    CockroachDB_DB商城概述CockroachDB是一个分布式关系型数据库,主要设计目标是可扩展,强一致和高可靠。在无人干预情况下,能以极短的中断时间容忍磁盘、主机、机架甚至整个数据中心的故障。采用完全去中心化架构,

    2022年8月4日
    7
  • 京东热卖华为5X Pro儿童表直降80元

    京东热卖华为5X Pro儿童表直降80元

    2026年3月14日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号