2

如果你觉得它很傻,请原谅我。我无法理解 BCD 的目的及其在编程中的实现?

到目前为止,我对 BCD 的理解是,它是一种以字节或半字节表示数据的内部方式。在一个简单的 C 程序中,我们声明变量 int、float 等,并根据需要对它们进行操作。在内部,它们可以表示为二进制数或 BCD。

现代计算器仅使用 BCD 格式。在 Intel 芯片中,该指令FBLD用于将打包的 BCD 值移动到 FPU 寄存器中。

我见过很少的汇编语言编程练习将 BCD 转换为十进制或其他方式。

它如何帮助程序员知道这一点?

BCD的知识对高级语言程序员有什么用处?

4

3 回答 3

2

BCD 完全按照它的名字命名:Binary oded Cecimal D。从本质上讲,这意味着我们不是在每 4 位存储一个十六进制数字,而是只存储一个十进制数字,浪费剩余空间。

这样做的重点主要在于算术,在观察小数点后的数字时,在十进制系统中需要完美(在最小舍入误差的意义上),但在十六进制(或二进制)系统中不一定是完美的。

在以前,这在会计软件等中很重要,但随着自然词的长度变大,这已成为一个问题。今天的解决方案通常使用 1/10 或 1/100 美分的整数运算。

另一个以前的用途是促进更轻松地连接到 7 段 LED 显示器 - 以 BCD 编码的数字可以逐个半字节地显示,而二进制表示需要模运算。

我敢肯定,在当今世界,只有在非常特殊的情况下,您才会在一定程度上遇到 BCD。

于 2014-03-27T01:08:17.667 回答
1

尽管您可以将其存储在普通的二进制变量中并以十六进制打印出来,但 C 中没有 BCD 格式。

在过去,BCD 主要用于存储在计算中很少涉及的十进制值(尤其是在 Eugen Rieck 说的会计软件中)。在这种情况下,输入和输出中在十进制和二进制之间转换的成本可能会超过由于除法缓慢或缺少硬件除数而使用的简单计算的成本。一些旧架构也可能有 BCD 算术指令,因此 BCD 可用于提高性能

但是现在这几乎没有问题,因为大多数现代架构已经放弃了对 BCD 数学的支持,并且在更大的寄存器(> 8 位)中这样做可能会导致更差的性能

于 2014-03-27T01:18:00.133 回答
0

Intel 芯片内部不使用 BCD 表示。它使用二进制表示,包括负整数的 2 的补码。但是,它具有某些指令,例如 AAA、AAS、AAM、AAD、DAA、DAS,用于将无符号整数值的加法、减法、乘法和除法的二进制结果转换为未打包/打包的 BCD 结果. 因此,英特尔芯片可以间接生成无符号整数的 BCD 结果。这些指令使用位于 AL 寄存器中的隐含操作数,并将转换结果放在 AL 寄存器中。有高级 BCD 处理指令可将 80 位压缩的有符号 BCD 格式值从内存移动到 FPU 寄存器,在 FPU 寄存器中它会自动转换为二进制格式,经过处理并转换回 BCD 格式。

于 2014-03-29T12:03:26.033 回答