2

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

在 Ruby 中,获取 -ve 整数并将其转换为 C 程序员想要的 64 位无符号整数的正确方法是什么?

4

2 回答 2

5

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

仅供参考,2的补码系统,本质上它将(例如)32位数字视为数字模2 ^ 32。这意味着 -1 与 2^32 - 1 或 0xFFFFFFFF 相同。事实证明,这在硬件级别上使用起来非常简单。

于 2008-11-19T07:48:42.450 回答
5

这可能有效:

x += 0x1_0000_0000_0000_0000 if x < 0

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

于 2008-11-19T07:56:38.267 回答