在两个 16 位寄存器中存储无符号长值
Storing unsigned long value in two 16bit register
我想在两个 16 位 register.For 示例中存储无符号长值,如果我有长值 (-2,147,483,648 to 2,147,483,647)
,那么我使用的公式如下:
v[0] = myValue % 65536
v[1] = myValue / 65536
从寄存器获取值
outVal = reg0 + (reg1 * 65536)
但是如何处理取值范围为0 to 4,294,967,295?
的unsigned long
正如评论者哈罗德已经指出的那样,您的公式甚至不能正确计算负数。
你应该按位而不是使用数学来避免意外(并加快速度,以防编译器没有为你优化它)。
拆分:
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)
这现在适用于有符号和无符号(前提是您的所有变量都具有相同的 "sign type")。
图例,如果您的语言(您未指定)使用不同的运算符:
&
是按位与,|
是按位或,<<
和>>
是按位移位left/right(SHL/SHR), 0x
标记一个十六进制文字(您可以使用 65536
而不是 0xFFFF
,但我认为十六进制文字可以更清楚地说明这个幻数的来源)。
我想在两个 16 位 register.For 示例中存储无符号长值,如果我有长值 (-2,147,483,648 to 2,147,483,647)
,那么我使用的公式如下:
v[0] = myValue % 65536
v[1] = myValue / 65536
从寄存器获取值
outVal = reg0 + (reg1 * 65536)
但是如何处理取值范围为0 to 4,294,967,295?
正如评论者哈罗德已经指出的那样,您的公式甚至不能正确计算负数。
你应该按位而不是使用数学来避免意外(并加快速度,以防编译器没有为你优化它)。
拆分:
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)
这现在适用于有符号和无符号(前提是您的所有变量都具有相同的 "sign type")。
图例,如果您的语言(您未指定)使用不同的运算符:
&
是按位与,|
是按位或,<<
和>>
是按位移位left/right(SHL/SHR), 0x
标记一个十六进制文字(您可以使用 65536
而不是 0xFFFF
,但我认为十六进制文字可以更清楚地说明这个幻数的来源)。