我正在使用 C 语言的 PIC 微处理器。它是 16F,因此它不能保存大于 32 位的整数(无符号int32
是可用的最大数据大小)
我从阅读器处收到一个 5 字节的 ID 代码。为了传输它,我必须逐位编码为 BCD。我无法将其冲刺为字符串,因为它大于数据大小,并且无法处理它。我无法划分它,因为没有为它定义任何操作。
我无法找出任何可能的解决方案,以前有人处理过这个问题吗?
EDIT:
我收到一系列 5 个字节的数字:
FF-FF-FF-FF-FF
我需要将其转换为十进制
0123456789012
(13位,十进制长度256^5)通过RS232发送。第二个函数(获取 ASCII 并发送)我已经可以使用它了,但我需要完整数字的字符串表示形式,然后才能对其执行任何操作。
假设您有 32 位算术:2**24 = 16777216,因此将 x 作为最高有效的 2 个字节,将 y 作为最低有效的 3 个字节:
(16777216 * x + y) / 1000
= (16777000 * x + 216 * x + y) / 1000
= 16777 * x + (216 * x + y) / 1000
第一项可以用 32 位计算而不会溢出(因为x < 2**16
)。
第二项也可以在没有溢出的情况下计算(因为x < 2**16
and y < 2**24
).
这基本上是基数的长除法2**24
一个 2 位数的值,但预先计算的项已知除数为 1000。选择 1000 是因为它是大于 10 的最小幂2**8
.
因此,首先计算最低三位数字,使用以下事实(2**32) % 1000 == 296
。所以这次我们将x作为最高字节,y作为低4字节
((2**32) * x + y) % 1000 = ((2**32) * x) % 1000 + y % 1000 (modulo 1000)
= (296 * x) % 1000 + y % 1000 (modulo 1000)
((2**32) * x + y) % 1000 = ((296 * x) % 1000 + y % 1000) % 1000
然后使用上面的公式将原始数字除以 1000。然后您就可以安全地进入 32 位领域,并可以使用正常循环生成剩余的数字。
顺便说一句,如果我是你,我会检查结果:我还没有对此进行测试,并且可能我在某个地方犯了错误。应该很容易与 PC 上使用常规方法在 64 位整数中完成的 bcd 转换结果进行比较。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)