【发布时间】:2021-06-07 14:22:27
【问题描述】:
我的问题是,当它超出 8 位范围时,我不知道如何处理。
我的程序使用较小的十六进制数字(如 #02h + #05h)运行,但不能使用较大的数字(如 #0A9H + #0B5H)。
【问题讨论】:
我的问题是,当它超出 8 位范围时,我不知道如何处理。
我的程序使用较小的十六进制数字(如 #02h + #05h)运行,但不能使用较大的数字(如 #0A9H + #0B5H)。
【问题讨论】:
对于 2 个数字,有一个 asm 技巧:进位标志保存 ADD 结果的第 9 位,我们可以通过进位右移右移该 9 位值。 8051 的RRC instruction 就是这样做的。
ADD A, R0
RRC
如果没有,请查看以下问题 How can I safely average two unsigned ints in C++? 和 Explanation of the safe average of two numbers
对于超过 2 个数字,执行扩展精度(使用加法进位)以保持更大的总和。
【讨论】:
10 * 0xff = 0x9f6)。不过,您可以在完成后使用 RRC 作为扩展精度除法的一部分。由于您的除数甚至不再是 2 的幂,因此该部分不仅仅是扩展精度移位。如果您需要更多帮助,请提出一个新问题,在其中描述您实际尝试做的事情(我没有在现有问题中找到此答案,因此希望此问答对当前形式的未来读者有用)。或者只是在 C 中使用 uint16_t,看看优化的 8051 编译器做了什么