在两个16位寄存器中存储无符号长值

时间:2016-07-12 11:41:39

标签: java long-integer cpu-registers unsigned-long-long-int

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

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

从寄存器

获取价值
outVal = reg0 + (reg1 * 65536)

但是对于无符号long,如何处理哪个值范围来自0 to 4,294,967,295?

1 个答案:

答案 0 :(得分:3)

正如哈罗德指出的那样,你的公式甚至不能正确地用于负数。

你应该按位而不是使用数学来避免意外(并且在编译器没有为你优化的情况下加快速度)。

分裂:

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)

现在适用于有符号和无符号(前提是所有变量都具有相同的&#34;符号类型&#34;)。

图例,如果您的语言(您没有指定)使用不同的运算符:

&为按位AND,|为按位OR,<<>>按位左移/右移(SHL / SHR),0x标记十六进制文字(您可以使用65536而不是0xFFFF,但我认为十六进制文字使得这个神奇数字的来源更加清晰。)