Go: konvertieren in int64 uint64 ohne Verlust von Informationen
Das problem mit dem folgenden code:
var x uint64 = 18446744073709551615
var y int64 = int64(x)
ist, dass y
ist -1
. Ohne Verlust von Informationen, ist der einzige Weg, um die Konvertierung zwischen diesen beiden Zahlentypen zu verwenden encoder und decoder?
buff bytes.Buffer
Encoder(buff).encode(x)
Decoder(buff).decode(y)
Beachten Sie, ich bin nicht versucht, eine gerade numerische Konvertierung in Ihrem typischen Fall. Ich bin mehr ein Anliegen, die statistische Eigenschaften der Zufallszahlen-generator.
- y -1 ist? Ist dein OS ein 32 bit one, oder ein 64-bit ein?
- Der Kerl, der downvoted mich, wieso der downvote? @VonC 64 bit.
- Ich habe nicht downvote (hier ist ein upvote). Ich wurde gefragt, über die OS wegen des tip.golang.org/doc/go1.1#int, wo sehen Sie -1 in 32bit OS nur.
- Ich sein werde. Ich Wette, wir eingerichtet haben, ist dieser Lack für die Ausführung als 32-bit!
- Was möchten Sie
y
zu sein, wenn nicht die -1? Sie wollen behaupten, dassx == y
nach dem Umbau und haben einen Fehler/Panik, wenn es nicht? - Ein random number generator liefert einen diskreten Satz von bits, die mit bestimmten zufälligen Eigenschaften. In diesem Fall sind es 64 bit von Ihnen. Ich möchte in der Lage sein, um die 64 bit und verwenden Sie Sie als eine
int64
. Ich will nicht, wie ich oben sagte, eine gerade numerische Konvertierung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen -1 wäre im Einklang mit einem Prozess ausgeführt wird, der als 32-bit.
Siehe zum Beispiel die Go1.1 release notes (das stellte
uint64
)Mit
fmt.Printf("%b\n", y)
helfen kann, um zu sehen, was Los ist (siehe ANisus' Antwort)Als es stellte sich heraus, das OP wheaties bestätigt (in den Kommentaren) es wurde zunächst in 32 bit (deshalb diese Antwort), aber dann erkennen
18446744073709551615
ist0xffffffffffffffff
(-1) trotzdem: sehen ANisusAntwort;-1
die ziemlich viel zerstört alle Zufälligkeit der bits.Ihre Konvertierung nicht verlieren keine Informationen in der Konvertierung. Alle bits werden unverändert. Es ist nur so, dass:
Versuchen:
und Sie haben
y = -4
.Zum Beispiel: Spielplatz
Ausgabe:
Den Typen uint64 und int64 können beide stellen 2^64 diskrete ganzzahlige Werte.
Den Unterschied zwischen den beiden ist, dass uint64 hält nur positive Ganzzahlen (0 thru 2^64-1), wo als int64 hält sowohl negative und positive Ganzzahlen, die Verwendung von 1 bit zu halten, die Zeichen (-2^63 thru 2^63-1).
Wie schon andere gesagt haben, wenn Ihr generator produzieren
0xffffffffffffffff
, uint64 vertritt dieser die raw-integer (18,446,744,073,709,551,615) in der Erwägung, dass int64 interpretiert wird Zweierkomplement Wert und -1 zurückgeben.