Использование ruby ​​для преобразования целых чисел без знака, сохраненных как обратно в исходное значение - PullRequest
2 голосов
/ 19 ноября 2008

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

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

Ответы [ 2 ]

5 голосов
/ 19 ноября 2008

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

x += 0x1_0000_0000_0000_0000 if x < 0

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

5 голосов
/ 19 ноября 2008

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

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

...