Использование ruby ​​для преобразования целых чисел без знака, сохраненных как обратно, в исходное значение

StackOverflow https://stackoverflow.com/questions/301259

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

x += 0x1_0000_0000_0000_0000 if x < 0

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top