C程序将它认为是64位无符号整数的东西放入Postgres数据库的一个列中,该数据库被输入为int8。 对于Postgres,int8总是'signed int8'(没有像'unsigned int8'那样)。 所以我的Ruby程序显示从该空间的上半部分中的Postgres检索到的数字为负数。

在Ruby中,采用-ve整数并将其转换为C程序员所期望的64位无符号整数的正确方法是什么?

有帮助吗?

解决方案

我不确定Ruby的细节,但基本上你需要添加2 ^ 64,如果数字为负数。这是假设数字存储为2的补码,几乎可以肯定的是。

FYI,2的补码系统,基本上它将(比方说的)32位数视为数字mod 2 ^ 32。这意味着-1与2 ^ 32 - 1或0xFFFFFFFF相同。事实证明,在硬件级别使用非常简单。

其他提示

这可能有效:

x += 0x1_0000_0000_0000_0000 if x < 0

巨大的常数是2到64,作为正常的字面值。我添加了下划线,以便更容易验证数字确实是一个后跟64位零。每个十六进制数字一如既往地代表四位。下划线是标准的Ruby语法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top