java - 将无符号长整型值存储在两个16位寄存器中

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

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

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

从寄存器获取值

outVal = reg0 + (reg1 * 65536)

但是对于取值范围为0到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)

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

<小时/>

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

&是按位与,|按位或,<<>>左/右按位移位 (SHL/SHR),0x标记十六进制文字(您可以使用 65536 而不是 0xFFFF ,但我认为十六进制文字可以更清楚地表明这个魔数(Magic Number)的来源)。

关于java - 将无符号长整型值存储在两个16位寄存器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38327926/

相关文章:

java - 我可以在部署到不同服务器的不同 EAR 上使用 JTA 吗?

web-services - Java 网络服务不适用于 Jdk 6 和 Jboss 5.x

python - 如何强制 Python JSON 输出从多头中排除 'L'

c - 为什么编译器将变量存储在寄存器中?

compiler-construction - 被调用者通过使用的寄存器保存调用者?

c - 为什么我不能在 C 中获取 asm 寄存器的值?

java - 在 java 中以编程方式生成 XSD

java - 确保类是不可变的

php - 在 SQL 查询中插入非常长的字符串 - 错误

Python MySQLdb 转换器不工作