Utilizzo di ruby ??per convertire numeri interi senza segno archiviati come ripristinati nel valore originale

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

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top