使用ruby将存储为signed的无符号整数转换回原始值

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

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

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

仅供参考,2的补充系统,它实际上将(比方说)32位数视为数字2 ^ 32。 这意味着-1与2 ^ 32 – 1或0xFFFFFFFF相同。 事实certificate,在硬件级别使用非常简单。

这可能有效:

x += 0x1_0000_0000_0000_0000 if x < 0 

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