2008-11-19 7 views
2

C-программа помещает то, что он считает 64-разрядными целыми без знака, в столбец базы данных Postgres, который вводится как int8. В Postgres int8 всегда «подписан int8» (нет такой вещи, как «unsigned int8»). Итак, программа Ruby, которую я показываю, отображает числа, полученные из Postgres в верхней половине этого пространства как отрицательные.Использование ruby ​​для преобразования целых без знака, сохраненных как подписанное обратно к исходному значению

Каков правильный способ, в Ruby, принять это -ve целое число и преобразовать его в 64-битное неподписанное целое число, предназначенное для программиста C-программиста?

ответ

4

Я не уверен в специфике Ruby, но по существу вам нужно добавить 2^64, если число отрицательно. Это предполагает, что число хранится как дополнение 2, что почти наверняка.

FYI, система комплемента 2, по сути, она рассматривает 32-битное число как число mod 2^32. Это означает, что -1 - это то же самое, что 2^32 - 1 или 0xFFFFFFFF. Это оказывается очень простым в использовании на аппаратном уровне.

5

Это может работать:

x += 0x1_0000_0000_0000_0000 if x < 0 

Огромная константа 2 в 64-й, как нормальный буквальным. Я добавил символы подчеркивания, чтобы упростить проверку того, что число действительно является одним, за которым следуют 64 бита нулей. Каждая шестнадцатеричная цифра представляет собой четыре бита, как всегда. Символы подчеркивания - стандартный синтаксис Ruby.