Mit Ruby gespeicherten Integer ohne Vorzeichen zu konvertieren, wie wieder auf den ursprünglichen Wert unterzeichnet

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

Frage

Ein C-Programm platzieren, was es 64-Bit-Integer ohne Vorzeichen in eine Spalte in einer Postgres-Datenbank hält, die als int8 eingegeben wird. Um Postgres wird int8 immer ‚unterzeichnet int8‘ (so etwas, um es als ‚unsigned int8‘). So Programm Ruby Ich habe zeigen Zahlen von Postgres in der oberen Hälfte dieses Raumes als negativ abgerufen werden.

Was ist der richtige Weg, in Ruby, dass -ve integer zu nehmen und wandelt es in den 64-Bit unsigned integer, dass der C-Programmierer gedacht?

War es hilfreich?

Lösung

Ich bin nicht sicher von Ruby Besonderheiten, aber im Wesentlichen benötigen Sie 2 ^ 64 zu addieren, wenn die Zahl negativ ist. Das ist vorausgesetzt, die Zahl wird als 2-Komplement gespeichert, die es fast sicher ist.

FYI, das Komplementsystem der 2 im Wesentlichen er behandelt ein (sagen wir) 32-Bit-Zahl als eine Zahl mod 2 ^ 32. Das bedeutet, -1 ist das gleiche wie 2 ^ 32-1 oder 0xFFFFFFFF. Dies erweist sich als sehr einfach auf Hardware-Ebene zu verwenden.

Andere Tipps

Dies könnte funktionieren:

x += 0x1_0000_0000_0000_0000 if x < 0

Die große Konstante ist 2 bis 64., als normale wörtliche. Ich fügte hinzu, die Unterstreichungen, um es einfacher zu verifizieren, dass die Zahl ist in der Tat eine Eins mit 64 Bits von Nullen gefolgt. Jede Hexadezimalzeichens stellt vier Bits, wie immer. Die Unterstrichen sind Standard-Ruby-Syntax.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top