auf little Endian zwei int32_t in einen int64_t einlesen, steh auf'm Schlauch
-
Hallo,
ich steh gerade ein bißchen aufm Schlauch.
Eine Zahl ist als Festkommazahl gegeben und zwar als zwei direkt hintereinanderliegende int32_ts.
Das manual sagt "The units are in the high 32-bit integer (at 0x574) and the fractional part is in the low 32-bit integer (at 0x570)".
Das heißt, auf einem little endian system kann ich den Krempel in einem Rutsch in einen int64_t einlesen.Wenn ich das ganze dann um 4 bytes shifte (also << 32 mache), sicherheitshalber die oberen Stellen mit &0xffffffff ausmaskiere und dann nach int32_t caste, habe ich die Vorkommastellen, richtig?
Leider kommt nur Blödsinn raus. Liegt wahrscheinlich an der Uhrzeit... schon zuviel programmiert heute.
Wo liegt mein Denkfehler?
Phil
-
Sobald du das Konstrukt als 64-Bit Integer ansprichst, so ist es egal, wie die Zahlen im Speicher liegen - der Shift-Operator arbeitet auf dem Wert der Zahl, nicht auf ihrer Speicherrepräsentation. Wenn du die Zahl also nach links shiftest, holst du die Nachkommastellen nach vorne.
-
Wie wärs, wenn du auf Shifterei verzichtest und union benutzt?
Für MSVC könnte es dann so aussehen:
typedef union { __int64 uint64; __int32 uint32[2]; } Map; Map map; map.uint32[0]=1; map.uint32[1]=2; printf("%I64x",map.uint64);
-
PhilippM schrieb:
Eine Zahl ist als Festkommazahl gegeben und zwar als zwei direkt hintereinanderliegende int32_ts.
Also warum nicht
*(int64_t *)ptrAufHintereinanderliegendeInt32_ts
?
-
SeppJ schrieb:
Sobald du das Konstrukt als 64-Bit Integer ansprichst, so ist es egal, wie die Zahlen im Speicher liegen - der Shift-Operator arbeitet auf dem Wert der Zahl, nicht auf ihrer Speicherrepräsentation. Wenn du die Zahl also nach links shiftest, holst du die Nachkommastellen nach vorne.
Das wars, Danke.