Ich versuche, den numerischen (doppelten) Wert von einem Bytearray von 16 Elementen wie folgt zu erhalten:
%Vor%aber es funktioniert nicht. Es scheint, dass die temporäre Variable, die das Ergebnis der Linksverschiebung enthält, nur 32 Bits speichern kann, da nach 4 Verschiebeoperationen von 8 Bits ein Überlauf auftritt.
Ich weiß, dass ich etwas wie
verwenden kann %Vor%Aber aus Neugierde habe ich mich gefragt, ob es eine Lösung für dieses Problem mit dem Schichtoperator gibt ...
Bearbeiten: das wird nicht funktionieren (siehe Kommentar) ohne etwas wie __int128
.
Der Ausdruck input[i]
wird in int
( 6.3.1.1 ), das sind 32 Bit auf Ihrem Computer. Um dieses Problem zu umgehen, muss der linke Operand wie in
oder
%Vor%und erinnere dich an endianess
Das Problem hierbei ist, dass die 32-Bit-Variablen tatsächlich nicht mehr als 4 * 8-mal verschoben werden können, d. h. Ihr Code funktioniert nur für 4 Zeichen.
Was Sie tun könnten, ist das erste signifikante Zeichen zu finden und Horners Gesetz zu verwenden: a n n + a n-1 < sup> n-1 + ... = ((... (a n
Kurz gesagt, Nein, Sie können eine Sequenz von byte
s nicht direkt in eine double
umwandeln, wie in Ihrem Codebeispiel gezeigt.
byte
, ein Integer-Typ und double
, ein Fließkomma-Typ (dh kein Integer-Typ) sind nicht bitweise kompatibel (dh Sie können nicht einfach Bitshift auf Werte von einem Haufen von Bytes in einen Fließkommatyp und erwarte ein äquivalentes Ergebnis.)
1) Unter der Annahme, dass das Byte-Array ein Speicherpuffer ist, der auf einen Integer-Wert verweist, sollten Sie in der Lage sein, Ihr byte
-Array mittels Bit-Shifting in eine 128-Bit-Ganzzahl zu konvertieren und dann die resultierende Ganzzahl in ein double
umzuwandeln. . Vergessen Sie nicht, dass Endian-Probleme je nach CPU-Architektur ins Spiel kommen können.
2) Unter der Annahme, dass das Byte-Array ein Speicherpuffer ist, der einen 128-Bit-langen doppelten Wert enthält, und unter der Annahme, dass keine Endian-Probleme vorliegen, sollten Sie den Wert aus dem Byte-Array in den langen doppelten Wert speichern können. p> %Vor%
Gut basierend auf der Vorrangstellung des Operators auf der rechten Seite von
%Vor%wird ausgewertet, bevor es in ein Double konvertiert wird. Sie verschieben also Input [i] um 8 * i Bits, wodurch das Ergebnis in einer 32-Bit-Variablen gespeichert wird und somit überläuft. Sie können Folgendes versuchen:
%Vor%Bearbeiten: Ich bin mir nicht sicher, was die Größe eines Double auf Ihrem System ist, aber bei mir sind es 8 Bytes, wenn dies für Sie ebenso der Fall ist wie die zweite Hälfte Ihres Input-Arrays nie gesehen werden, da die Verschiebung sogar den doppelten Typ überläuft.