Usando ruby ??para convertir enteros sin signo almacenados como firmados al valor original

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

Pregunta

Un programa C está colocando lo que considera 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 es '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 al entero unsigned de 64 bits que pretendía el programador C?

¿Fue útil?

Solución

No estoy seguro de los detalles de Ruby, pero esencialmente necesitas agregar 2 ^ 64 si el número es negativo. Eso supone que el número se almacena como complemento de 2, lo que casi seguro es.

Para su información, el sistema de complemento de 2, esencialmente trata un (digamos) número 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 muy simple de usar a nivel de hardware.

Otros consejos

Esto podría funcionar:

x += 0x1_0000_0000_0000_0000 if x < 0

La gran constante es del 2 al 64, como un literal normal. Agregué los guiones bajos para que sea más fácil verificar que el número sea 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top