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

Java 在两个16位寄存器中存储无符号长值,java,long-integer,cpu-registers,unsigned-long-long-int,Java,Long Integer,Cpu Registers,Unsigned Long Long Int,我想在两个16位寄存器中存储无符号长值。例如,如果我有长值(-2147483648到2147483647),那么我使用的公式如下: v[0] = myValue % 65536 v[1] = myValue / 65536 从寄存器中获取值 outVal = reg0 + (reg1 * 65536) 但是如何处理无符号长字符,它的值范围是从0到4294967295?正如评论员哈罗德已经指出的那样,你的公式甚至不能正确处理负数 您应该按位执行,而不是使用数学来避免意外(如果编译器没有为您优化

我想在两个16位寄存器中存储无符号长值。例如,如果我有长值
(-2147483648到2147483647)
,那么我使用的公式如下:

v[0] = myValue % 65536
v[1] = myValue / 65536
从寄存器中获取值

outVal = reg0 + (reg1 * 65536)

但是如何处理无符号长字符,它的值范围是从
0到4294967295?

正如评论员哈罗德已经指出的那样,你的公式甚至不能正确处理负数

您应该按位执行,而不是使用数学来避免意外(如果编译器没有为您优化它,则可以加快速度)

拆分:

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)

outVal=reg0 |(reg1正如评论员哈罗德已经指出的那样,您的公式甚至不能正确地用于负数

您应该按位执行,而不是使用数学来避免意外(如果编译器没有为您优化它,则可以加快速度)

拆分:

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)

outVal=reg0|(reg1)你知道这个公式有效吗?因为它看起来很吓人。它应该适用于无符号运算,但是有符号的。。我不知道,它只是让我很不舒服。当将原来的负值合并回来时,它会在上16位给你不正确的结果,除非你将假定的16位值存储在有符号的内存中32位变量,是(这有点违背此目的)。当然,如果
/
运算符是浮点除法,然后四舍五入到最接近的整数,而不是整数除法,则它根本不起作用。您显示的值是
int
的最小值/最大值。您希望将其存储为2x16位=32位=int
的大小。但您询问如何存储长值,即64位?那么你想存储什么呢?你知道这个公式有效吗?因为它看起来很吓人。它应该适用于无符号运算,但是有符号的。我不知道,它只会让我很不舒服。当把原来的负值归并回来时,它会在上16位给你不正确的结果,除非你存储的是假定的1有符号32位变量中的6位值,是(这有点违背此目的)。当然,如果
/
运算符是浮点除法,然后四舍五入到最接近的整数,而不是整数除法,则它根本不起作用。您显示的值是
int
的最小值/最大值。您希望将其存储为2x16位=32位=int
的大小。但您询问如何存储长值,即64位?那么您想存储什么呢?那么我的示例应该按原样工作。请参见,然后我的示例应该按原样工作。请参见