【发布时间】:2019-07-02 14:32:12
【问题描述】:
例如十进制数395的BCD码为001110010101,直接二进制转换为110001011, 哪一台值计算机可以用于算术运算
【问题讨论】:
标签: binary cpu-architecture symbolic-math code-conversion
例如十进制数395的BCD码为001110010101,直接二进制转换为110001011, 哪一台值计算机可以用于算术运算
【问题讨论】:
标签: binary cpu-architecture symbolic-math code-conversion
大多数 CPU 仅对二进制数提供有效的硬件支持(在现代 CPU 中通常仅支持 2 的幂大小,因此您希望将其填充到至少 16 位)。
您可以实现压缩 BCD(每半字节 1 位),但是,使用移位/掩码和比较操作来检查数字是否变为 >9,并手动将进位传播到下一个数字(此字节的高半字节,或到下一个字节)。即作为加法/减法的一部分,类似于带进位的扩展精度二进制加/减。
一些 CPU 甚至有一个从低半字节进位的标志。例如x86 的自动对焦。在 16 位和 32 位模式下,x86 甚至有(慢)指令来调整正常二进制加法减去包含两个压缩 BCD 数字的字节后的结果。 (DAA / DAS,以及其他用于解压 BCD(每字节 1 位)的指令,全部在 64 位模式下被删除,并且在当前 CPU 上以 16 位和 32 位模式进行微编码,速度很慢)。
其他一些 ISA 对帮助计算压缩 BCD 也有类似的支持,例如半字节进位标志。
未打包的 BCD(每字节 1 位)更容易实现,因为您可以比较 >9 的整个字节,而无需先提取低 4 位,以生成下一位的进位信号。 (高4位可以在不拆包的情况下检查>= (10<<4)。)
但是任何带有 AND/OR 和右/左移位指令的普通架构都可以很容易地提取半字节并执行 >9 并完全手动调整 + 进位检查。做多个操作,你可能最好暂时解包为字节并在最后重新打包,甚至转换为二进制。
但是从二进制转换回 BCD 的成本很高:您必须将结果的每个非零数字除以 10,一次生成一个数字。这需要乘法和移位,这在低端 CPU 上很慢。 Why does GCC use multiplication by a strange number in implementing integer division?。如果您有更多的二进制位可以提供给单个乘法或除法,那么在数字变得足够小之前,每个数字的成本要高得多。
【讨论】: