Utilizzo di ruby ??per convertire numeri interi senza segno archiviati come ripristinati nel valore originale
-
08-07-2019 - |
Domanda
Un programma C sta inserendo quelli che considera numeri interi senza segno a 64 bit in una colonna in un database Postgres che è scritto come int8. Per Postgres, int8 è sempre "firmato int8" (non esiste come "uns8 int8"). Quindi il programma Ruby che ho mostra i numeri recuperati da Postgres nella metà superiore di quello spazio come negativi.
Qual è il modo corretto, in Ruby, di prendere quell'intero -ve e convertirlo nell'intero senza segno a 64 bit che il programmatore C intendeva?
Soluzione
Non sono sicuro delle specifiche di Ruby, ma essenzialmente è necessario aggiungere 2 ^ 64 se il numero è negativo. Ciò presuppone che il numero sia memorizzato come complemento di 2, cosa che quasi certamente è.
FYI, il sistema del complemento a 2, essenzialmente tratta un numero (diciamo) a 32 bit come un numero mod 2 ^ 32. Questo significa che -1 è la stessa cosa di 2 ^ 32 - 1 o 0xFFFFFFFF. Questo risulta essere davvero semplice da usare a livello hardware.
Altri suggerimenti
Potrebbe funzionare:
x += 0x1_0000_0000_0000_0000 if x < 0
L'enorme costante è da 2 a 64, come un normale valore letterale. Ho aggiunto i trattini bassi per rendere più semplice la verifica che il numero sia effettivamente uno seguito da 64 bit di zero. Ogni cifra esadecimale rappresenta quattro bit, come sempre. I trattini bassi sono sintassi standard di Ruby.