pedir globales datos curso como ruby postgresql unsigned signed

globales - Usar ruby ​​para convertir enteros sin signo almacenados como regresados ​​al valor original



variables en ruby (2)

No estoy seguro de los detalles de Ruby, pero básicamente necesitas agregar 2 ^ 64 si el número es negativo. Eso es suponiendo que el número se almacena como complemento de 2, que casi con seguridad es.

Para su información, el sistema complementario de 2, esencialmente trata un número (digamos) de 32 bits como un número mod 2 ^ 32. Esto significa que -1 es lo mismo que 2 ^ 32 - 1 o 0xFFFFFFFF. Esto resulta ser realmente simple de usar en un nivel de hardware.

Un C-programa está colocando lo que considera ser enteros sin signo de 64 bits en una columna en una base de datos de Postgres que se escribe como int8. Para Postgres, int8 siempre está ''firmado int8'' (no existe tal cosa como ''unsigned int8''). Entonces el programa Ruby que tengo muestra los números recuperados de Postgres en la mitad superior de ese espacio como negativos.

¿Cuál es la forma correcta, en Ruby, de tomar ese entero -ve y convertirlo en el entero sin signo de 64 bits que el C-programador pretendía?


Esto podría funcionar:

x += 0x1_0000_0000_0000_0000 if x < 0

La gran constante es de 2 a 64, como un literal normal. Agregué los guiones bajos para que sea más fácil verificar que el número es de hecho uno seguido de 64 bits de ceros. Cada dígito hexadecimal representa cuatro bits, como siempre. Los guiones bajos son la sintaxis estándar de Ruby.