【发布时间】:2017-09-01 15:15:38
【问题描述】:
我这里有一个小型“PLC”,它在 32 位 MCU 上运行。 我可以定义的最大变量是 uint32(无符号整数)。 我正在读一米,它给我 6 个字符的 48 位值(通过串行线)。 我现在通过移动字符将这个值存储在两个 32 位中。
T1Low = (unsigned int) mybuffer[3] << 24 | (unsigned int) mybuffer[2] << 16 |
(unsigned int) mybuffer[1] << 8 | (unsigned int) mybuffer[0];
T1High = (unsigned int) mybuffer[5] << 8 | (unsigned int) mybuffer[4];
但是我想把48bit的值除以1000,然后保存到一个32bit(因为除之后,它会给我足够的精度)。
理论上是这样的
unsigned int result = (T1High << 32 | T1Low) / 1000;
这当然行不通,因为变化太大... 有什么办法可以做到这一点?
编辑:决议的描述: 仪表以 kWh 为单位测量,但值以 Wh 为单位。最大值为 9 999 999,足以保存在 32 位中。但是从仪表上我会得到 9 999 999 000...所以我需要在最后切掉 3 个零..
EDIT2:正确答案由 cmaster 给出:) 如果有人只想将代码放入 2 行,那么:
unsigned int value1;
unsigned int value2;
unsigned int value3;
value2 += (value1%1000) << 16;
unsigned long result = ((value2 / 1000) << 16) | ((value3 + ((value2 % 1000) << 16)) / 1000);
【问题讨论】:
-
您需要查找“多精度算术”或相关内容。是的,有办法做到这一点。完整的通用解决方案(例如GMP — GNU Multi-Precision)可能有点矫枉过正,但你最终会使用函数来完成这项工作,而且它们不会是微不足道的。
-
无符号整数结果 = (T1High > 10)
-
KonstantinL:我会丢失太多精度。我只需要从数字中删除 3 个零...
标签: c 32bit-64bit 32-bit