对于算术运算,计算机可以使用二进制代码或数字的直接二进制等价物或两者兼而有之?
For a arithmetic operation computer can use binary code or direct binary equivalent of a number or both?
例如十进制数395的BCD码为001110010101直接二进制转换为110001011,
算术运算可以用哪一个值的计算机
大多数 CPU 仅对二进制数提供有效的硬件支持(并且通常仅适用于现代 CPU 中的 2 的幂大小,因此您希望至少将其填充到16 位)。
您可以 实现 压缩 BCD(每个半字节 1 位数字),但是,使用 shift/mask 和比较操作来检查数字变为 >9
,并手动将进位传播到下一个数字(该字节的高半字节,或传播到下一个字节)。即作为加法/减法的一部分,类似于带进位的扩展精度二进制 add/sub。
一些 CPU 甚至有一个从低半字节进位的标志。例如x86 的自动对焦。在 16 位和 32 位模式下,x86 甚至有(慢速)指令来调整正常二进制加减包含两个压缩 BCD 数字的字节后的结果。 (DAA / DAS,以及其他用于解压缩 BCD 的指令(每字节 1 位),全部在 64 位模式下删除,并且在当前 16 位和 32 位模式下的 CPU 上大多是慢速微编码。
其他一些 ISA 也有类似的支持来帮助计算压缩 BCD,例如半字节进位标志。
Unpacked BCD (1 digit per byte) 更容易实现,因为你可以比较整个字节 >9
而无需先提取低 4 位,为下一位生成进位信号. (不用解包就可以查到高4位>= (10<<4)
)
但是任何带有 AND/OR 和 right/left-shift 指令的普通架构都可以很容易地提取半字节并完全手动执行 >9
和调整 + 进位检查。 如果您正在进行多项操作,最好暂时解包为字节并在最后重新打包,甚至转换为二进制。
但是从二进制转换回 BCD 非常昂贵:您必须对结果的每个非零数字除以 10,一次产生一个数字。这需要乘法和移位,这在低端 CPU 上很慢。 Why does GCC use multiplication by a strange number in implementing integer division?。如果您有更多的二进制位可以提供给单个乘法或除法,那么在数字变得足够小之前,每个数字的成本要高得多。
例如十进制数395的BCD码为001110010101直接二进制转换为110001011, 算术运算可以用哪一个值的计算机
大多数 CPU 仅对二进制数提供有效的硬件支持(并且通常仅适用于现代 CPU 中的 2 的幂大小,因此您希望至少将其填充到16 位)。
您可以 实现 压缩 BCD(每个半字节 1 位数字),但是,使用 shift/mask 和比较操作来检查数字变为 >9
,并手动将进位传播到下一个数字(该字节的高半字节,或传播到下一个字节)。即作为加法/减法的一部分,类似于带进位的扩展精度二进制 add/sub。
一些 CPU 甚至有一个从低半字节进位的标志。例如x86 的自动对焦。在 16 位和 32 位模式下,x86 甚至有(慢速)指令来调整正常二进制加减包含两个压缩 BCD 数字的字节后的结果。 (DAA / DAS,以及其他用于解压缩 BCD 的指令(每字节 1 位),全部在 64 位模式下删除,并且在当前 16 位和 32 位模式下的 CPU 上大多是慢速微编码。
其他一些 ISA 也有类似的支持来帮助计算压缩 BCD,例如半字节进位标志。
Unpacked BCD (1 digit per byte) 更容易实现,因为你可以比较整个字节 >9
而无需先提取低 4 位,为下一位生成进位信号. (不用解包就可以查到高4位>= (10<<4)
)
但是任何带有 AND/OR 和 right/left-shift 指令的普通架构都可以很容易地提取半字节并完全手动执行 >9
和调整 + 进位检查。 如果您正在进行多项操作,最好暂时解包为字节并在最后重新打包,甚至转换为二进制。
但是从二进制转换回 BCD 非常昂贵:您必须对结果的每个非零数字除以 10,一次产生一个数字。这需要乘法和移位,这在低端 CPU 上很慢。 Why does GCC use multiplication by a strange number in implementing integer division?。如果您有更多的二进制位可以提供给单个乘法或除法,那么在数字变得足够小之前,每个数字的成本要高得多。