Konvertieren von Byte-Array in Doppel - c

8

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 ...

    
paolo_ 19.08.2009, 17:12
quelle

7 Antworten

4

Bearbeiten: das wird nicht funktionieren (siehe Kommentar) ohne etwas wie __int128 .

%Vor%

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

64bit sein %Vor%

oder

%Vor%

und erinnere dich an endianess

    
Adrian Panasiuk 19.08.2009, 17:25
quelle
4

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 ) .x + a ) n-2) x + ...) + a 0 wie folgt:

%Vor%     
xtofl 19.08.2009 18:13
quelle
2

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%     

Jeff Leonard 19.08.2009 17:25
quelle
2

Warum werfen Sie das Array nicht einfach auf einen Doppelzeiger?

%Vor%

Wenn Sie endian-ness korrigieren müssen, kehren Sie das char-Array mithilfe der STL reverse () um, bevor Sie es in ein doppeltes Array umwandeln.

    
Inverse 20.08.2009 04:32
quelle
1

Hast du std :: atof versucht:

Ссылка

    
fbrereto 19.08.2009 17:18
quelle
1

Möchten Sie eine Zeichenfolgendarstellung einer Zahl in eine reelle Zahl umwandeln? In diesem Fall ist der C-Standard atof dein bester Freund.

    
xcramps 19.08.2009 17:19
quelle
0

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.

    
DeusAduro 19.08.2009 17:17
quelle

Tags und Links