2016-07-12 85 views
0

I unsigned long-Wert in zwei 16-Bit-register.For Beispiel gespeichert werden soll, wenn ich (-2,147,483,648 to 2,147,483,647) long-Wert habe, dann Formel verwende ich wie:Speicher unsigned long-Wert in zwei 16-Bit-Registern

v[0] = myValue % 65536 
v[1] = myValue/65536 

Um Wert zu erhalten aus registrieren

outVal = reg0 + (reg1 * 65536) 

Aber wie für unsigned long zu tun, den Wertebereich von 0 to 4,294,967,295? ist

+0

Wissen Sie, dass Formel funktioniert? Weil es für mich ziemlich unheimlich aussieht. Es sollte mit unsigned Operationen funktionieren, aber signiert .. Ich weiß es nicht, es macht mich nur sehr unangenehm – harold

+0

Es wird Ihnen falsche Ergebnisse in den oberen 16 Bits geben, wenn Sie einen ursprünglich negativen Wert zurück, es sei denn, Sie speichern die angeblich 16-Bit-Werte in einer vorzeichenbehafteten 32-Bit-Variablen, ja (was irgendwie gegen den Zweck ist). Und natürlich wird es überhaupt nicht funktionieren, wenn der Operator '/' eine Float-Division ist, die danach auf die nächste ganze Zahl gerundet wird, und nicht eine ganzzahlige Division. – CherryDT

+1

Die von Ihnen angezeigten Werte sind Min/Max-Werte eines 'int'. Sie möchten es in 2x16 Bit speichern = 32 Bit = Größe eines 'Int'. Aber Sie fragen, wie man ein ** langes ** speichert, welches 64 Bits ist? Was willst du also speichern? – Arjan

Antwort

3

Als Kommentator harold bereits erwähnt, Ihre Formel nicht funktioniert sogar für negative Zahlen.

Sie sollten es bitweise tun, anstatt Mathe zu verwenden, um Überraschungen zu vermeiden (und Dinge zu beschleunigen, falls der Compiler es nicht bereits für Sie optimiert hat).

Splitting:

v[0] = myValue & 0xFFFF 
v[1] = myValue >> 16 // this implicitly cuts off the lower 16 bits 
         // by shifting them away into the nirvana 

Joining:

outVal = reg0 | (reg1 << 16) 

Dies gilt nun sowohl mit und ohne Vorzeichen (vorausgesetzt, dass alle Variablen haben den gleichen "Zeichen-Typen").


Legend, falls Sie die Sprache (die Sie nicht angegeben haben) verwendet verschiedene Operatoren:

& ist bitweise AND, | ist bitweise OR, << und >> sind bitweise nach links/rechts verschieben (SHL/SHR), 0x markiert ein Hexadezimal-Literal (Sie könnten 65536 anstelle von 0xFFFF verwenden, aber ich denke, das Hex-Literal macht es klarer, woher diese magische Zahl stammt).

+0

Ich schreibe Code in Java – Josef

+1

Dann sollte mein Beispiel so funktionieren wie es ist. Siehe auch https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html – CherryDT