一个C程序将它认为是64位无符号整数的东西放入Postgres数据库中的一个列,该数据库被输入为int8.对于Postgres,int8总是'signed int8'(没有像'unsigned int8'那样).因此,我所使用的Ruby程序显示从该空间的上半部分中的Postgres检索到的数字为负数.
在Ruby中,采用-ve整数并将其转换为C程序员所期望的64位无符号整数的正确方法是什么?
我不确定Ruby的细节,但是如果数字为负数,则基本上需要添加2 ^ 64。假设数字存储为2的补数,几乎可以肯定是这样。
FYI是2的补码系统,从本质上讲,它将(例如)32位数字视为2到32的数字。这意味着-1与2 ^ 32-1或0xFFFFFFFF相同。事实证明,在硬件级别使用起来非常简单。
这可能有效:
x += 0x1_0000_0000_0000_0000 if x < 0
巨大的常数是2到64,作为正常的字面值.我添加了下划线,以便更容易验证数字确实是一个后跟64位零.每个十六进制数字一如既往地代表四位.下划线是标准的Ruby语法.