aufteilung in high und low!



  • Hi zusammen!

    Muß gerade ein pascal programm in vc++ umschreiben und habe folgendes problem:

    mit

    (hi(liZahl));
    (lo(liZahl));
    

    wird "liZahl" anscheinend in den high und low-anteil aufgeteilt.
    liZahl ist ein long int.

    Meine Frage ist jetzt: Wie mach ich genau das in c++?

    Danke im voraus!



  • Da musst du in C(++) immer gut aufpassen, da den Typen keine feste Groesse zugewiesen ist. Auf einer 64bit-Architektur ist ein long int afaik gleich lang wie ein int.

    typedef uint64 ...;
    typedef uint32 ...;
    
    uint64 zahl = ...;
    
    //fuer big endian, fuer low einfach vertauschen
    uint32 low = *reinterpret_cast<uint32*>(&zahl);
    uint32 high = *(reinterpret_cast<uint32*>(&zahl) + 1);
    


  • LOWORD und HIWORD aus der WinAPI, sollte auch mit int gut funtkionieren. Musst aber nachschauen mit welchem Typ die definiert sind.

    MfG SideWinder



  • Thomas (: schrieb:

    Da musst du in C(++) immer gut aufpassen, da den Typen keine feste Groesse zugewiesen ist. Auf einer 64bit-Architektur ist ein long int afaik gleich lang wie ein int.

    typedef uint64 ...;
    typedef uint32 ...;
    
    uint64 zahl = ...;
    
    //fuer big endian, fuer low einfach vertauschen
    uint32 low = *reinterpret_cast<uint32*>(&zahl);
    uint32 high = *(reinterpret_cast<uint32*>(&zahl) + 1);
    

    Äääähm ok, nur um zu gucken ob ich`s richtig verstanden habe:

    short int low = *reinterpret_cast<uint32*>(&zahl);
    short int high = *(reinterpret_cast<uint32*>(&zahl) + 1);
    

    Wäre das korrekt? 😕



  • Thomas (: schrieb:

    Auf einer 64bit-Architektur ist ein long int afaik gleich lang wie ein int.

    Kommt ganz darauf an, welches Datenmodell genutzt wird. Bei LLP64 wäre dies zB so, bei LP64 zB nicht.



  • Habe es gelöst und zwar folgendermaßen:

    short int lo_wert = wert & 0x00ff;
    short int hi_wert = (wert & 0xff00) >> 8;
    

    Nur falls es jemanden interessiert, funktioniert auf jeden Fall 🙂



  • Naja, wenn du ein 2-Byte short in zwei 1-Byte Teile zerlegen willst, klappt das richtig. Ansonsten müsstest du die Werte etwas anpassen:

    int val = ...;
    short lo = val & 0xFFFF;
    short hi = (val>>16) & 0xFFFF;
    

Anmelden zum Antworten