gpt4 book ai didi

c - 在 32 位机器上使用 48 位

转载 作者:太空宇宙 更新时间:2023-11-04 05:23:47 25 4
gpt4 key购买 nike

我这里有一个小型“PLC”,它在 32 位 MCU 上运行。我可以定义的最大变量是 uint32(unsigned int)。我正在读取一个仪表,它以 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 给出 :) 如果有人想把代码只写成两行,那么:

unsigned int value1;
unsigned int value2;
unsigned int value3;

value2 += (value1%1000) << 16;
unsigned long result = ((value2 / 1000) << 16) | ((value3 + ((value2 % 1000) << 16)) / 1000);

最佳答案

从数学上讲,T1High << 32 | T1Low相当于

T1High * 2**32 + T1Low

dvision of sum 可以用 sum of division 代替,可以得到下面的公式:

((T1High * 2**16 * 2**16) + T1Low) / 1000
(T1High * 2**16 / 1000 * 2**16) + (T1Low / 1000)
(((T1High << 16) / 1000) << 16) + (T1Low / 1000)

不过,这可能会导致精度下降:

4823248397 = ((1123 << 32) + 123899) / 1000
4823187579 = (((1123 << 16) / 1000) << 16) + (123899 /1000)

关于c - 在 32 位机器上使用 48 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43257751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com