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

8421BCD 码的故事

  • 一、BCD码
    • 1.由来
    • 2.8421BCD码
    • 3.修正
  • 二、底层验证修正计算
    • 1.无修正计算
    • 2.有修正计算

一、BCD码

1.由来

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

举例: 明明二进制 0110 (B)代表数字 6,但是人们更习惯,也更喜欢的数 阿拉伯数字 6 ,也可以是 中文 六。
那么,这里就存在一个问题,我们使用计算器,是输入的为十进制数 25,但是计算机使用二进制数来处理信息,那么就得将 25 (D)转化成 0001 1001 (B),同样计算 25 + 25时,计算机也是处理二进制的25相加,而运算结果 0011 0010(B)还是的需要转化为 十进制 50,展示给人看。而人是直接使用十进制运算。

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

前人想出了,一种比较适合十进制系统的二进制编码的特殊形式,即将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位二进制表示,一个字节表示两位十进制数。例如10010110B表示十进制数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 startdb 8db 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楼

编码 8421BCD 码的故事相关推荐

  1. 【数电】(一) 进制转换编码 原码,反码,补码

    文章目录 前提知识 计算机发展史 集成电路(Integrated Circuit) 数字集成电路 0 1思维 1Bit 机器码 加法器 二进制与十进制之间的转换 BCD编码 原码,反码,补码 原码 反 ...

  2. 8421BCD码 5421BCD码 余三码 格雷码 余三循环码之间的关系,转换以及简易方法

    8421BCD码 5421BCD码 余三码 格雷码 余三循环码之间的关系,转换以及简易方法 1. 有权码和无权码的包括 2.各种码值的介绍 8421码的简介 8421码又称为BCD码,是十进代码中最常 ...

  3. 模24的8421BCD码计数器(Verilog HDL语言描述)(仿真与综合)

    目录 前言 原理 Verilog HDL程序设计 测试代码 仿真波形图 ISE综合后 RTL Schematic Technology Schematic 前言 本博文用Verilog HDL语言描述 ...

  4. 一位8421BCD码转5421码,2421码,余3码组合电路(附思路)

    一. 题目分析 (1) 输入码A3A2A1A0:8421BCD码. (2) 输出码B3B2B1B0:余3.5421和2421BCD码. (3) 输入BCD码型选择由一只单刀单掷开关控制(注意:开关用来 ...

  5. C语言实现Base64编码转码

    C语言实现Base64编码转码 关于Base64的介绍有两篇文章已经做得非常好了:一篇是维基百科Base64的词条,如果被Q可以看本文

  6. 8421BCD码加法的修正证明

    8421BCD码加法的修正证明 正数表示的两种定义 对于一个正数 n n n我们可以将其以两种形式表示 公式一: n = ∑ i = 0 m A i × 1 0 i , ∀ i ∈ [ 0 , m ] ...

  7. 关于8421BCD码与余三码

    BCD码其实就是4bit二进制数映射0~9十个十进制数. 余三码存在的必要性: 8421BCD码总共十六个,因只映射0~9,所以有六个二进制数是冗余的.则8421BCD码做加法运算时候会出问题,因为十 ...

  8. 基于 FFMPEG 的视频编码 源码(libavcodec,C++ Qt)

    基于 FFMPEG 的视频编码 源码(libavcodec,C++ Qt) 昨晚把源代码好好整理了一下,加入了视频时间限制功能.源码放这里,大家随便用. 关于代码的解释可以看我另一篇博客: 基于 FF ...

  9. 数字时钟计数器(内含模60计数器以及8421BCD码计数器设计代码)

    目录 前言 模60计数器 verilog设计代码如下: ISE综合 模24的8421BCD码计数器 原理 verilog HDL代码 测试文件 仿真波形 数字时钟计数器 verilog HDL代码 测 ...

  10. 计算机字符编码——ASCII码和常用编码

    计算机字符编码--ASCII码和常用编码 ASCII码 基本介绍 上个世纪60年代, 美国制定了一套字符编码, 对英语字符与二进制位之间的关系, 做了统一规定,这被称为ASCII码. ASCII码一共 ...

最新文章

  1. redis 登录注册
  2. exists的用法 python_5 年 Python ,总结的 10 条 Python 使用技巧
  3. 光端机的作用有哪些?
  4. 什么是气泡图?怎样用Python绘制?怎么用?终于有人讲明白了
  5. 安恒发布态势感知通报预警中心——“先知”
  6. Ubuntu Mate 开机自启ROS
  7. [Java] 蓝桥杯BASIC-27 基础练习 2n皇后问题
  8. Ubuntu配置maven
  9. ASP.NET开发学习视频教程大全(共800集)
  10. 防火墙转发流量的原理
  11. 网络打印机拒绝访问,无法连接处理方法汇总
  12. 08-微信公众号素材管理
  13. 在微信小程序开发中遇见的bug及解决方案
  14. 什么是3C认证?3C认证的介绍
  15. ANSYS - 表格加载方法
  16. 关于NorFlash的一点总结
  17. 小傻蛋的妹妹跟随小甲鱼学习Python的第二十节020
  18. 京东前台产品基础面试经历
  19. Excel - VBA -复制单元格值粘贴
  20. p2p终结者使用方法

热门文章

  1. Defect Analysis
  2. python查看微信撤回消息_Python查看微信撤回消息代码
  3. c语言录制,C语言中如何录制屏幕
  4. springboot2.0整合logback日志(详细)
  5. 亲爱的热爱的百度云全集资源
  6. [JS真好玩] 掘金创作者必备: 监控每天是谁取关了你?
  7. 我国云计算中心大盘点
  8. 转载 | 上汽集团云计算中心的开源之路
  9. 我的2021年终总结
  10. springboot 优雅关闭_SpringBoot 2.3.0 优雅关闭 shutdown graceful