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


  • Mod

    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.


Anmelden zum Antworten