0

我想将 unsigned long 值存储在两个 16 位寄存器中。例如,如果我有 long 值(-2,147,483,648 to 2,147,483,647),那么我使用的公式如下:

v[0] = myValue % 65536
v[1] = myValue / 65536

从寄存器中获取值

outVal = reg0 + (reg1 * 65536)

但是如何为 unsigned long 哪个值范围来自0 to 4,294,967,295?

4

1 回答 1

3

正如评论者 harold 已经指出的那样,您的公式甚至不适用于负数。

你应该按位而不是使用数学来避免意外(并加快速度,以防编译器已经为你优化它)。

拆分:

v[0] = myValue & 0xFFFF
v[1] = myValue >> 16    // this implicitly cuts off the lower 16 bits
                        // by shifting them away into the nirvana

加盟:

outVal = reg0 | (reg1 << 16)

这现在适用于有符号和无符号(假设所有变量都具有相同的“符号类型”)。


Legend,以防您的语言(您未指定)使用不同的运算符:

&是按位与,|是按位或,<<并且>>是按位向左/向右移动(SHL/SHR),0x标记十六进制文字(您可以使用65536代替0xFFFF,但我认为十六进制文字可以更清楚地说明这个幻数的来源)。

于 2016-07-12T11:45:46.920 回答