Problem mit std::memcpy



  • Hallo,
    ich wollte folgenden Code bei mir zum laufen bringen. Ich weis, dass ich das auch einfacher ohne memcpy schreiben kann. Mir geht es aber darum zu verstehen, warum der Code unten nicht funktioniert (auf meinem System: unsigned int = 32bit, unsigned long long = 64 bit, little endian). Meiner Meinung nach sollten die 4 oberen byte von i64 in high kopiert werden und in high sollte dann 2 stehen. Tatsächlich steht in high aber irgend eine Abfolge von bits (1967614884). Sieht jemand, wo mein Fehler liegt?

    unsigned long long i64 = 0x0000000200000000ULL;
    unsigned int high;
    std::memcpy( &high, &i64 + sizeof(unsigned int), sizeof(unsigned int) );
    


  • Zeiger werden bei der Addition mit int elementweise erhöht, nicht Byte-weise.
    Es müsste also heißen:

    reinterpret_cast<char *>(&i64) + sizeof(unsigned int)
    


  • Nur der Vollstaendigkeit wegen: Der Weg ueber union ist wohl besser.


  • Administrator

    knivil schrieb:

    Nur der Vollstaendigkeit wegen: Der Weg ueber union ist wohl besser.

    Und undefiniert ...

    Grüssli



  • TyRoXx schrieb:

    Zeiger werden bei der Addition mit int elementweise erhöht, nicht Byte-weise.
    Es müsste also heißen:

    reinterpret_cast<char *>(&i64) + sizeof(unsigned int)
    

    Warum nicht gleich

    reinterpret_cast<unsigned int*>(&i64) + 1
    

    ?



  • @wxSkip
    Das ist ne gute Frage. Welche Variante würdest du denn wählen? (abgesehen davon, dass man einfach (unsigned int)(i64>>32) schreiben könnte)



  • ChubAKA schrieb:

    @wxSkip
    Das ist ne gute Frage. Welche Variante würdest du denn wählen? (abgesehen davon, dass man einfach (unsigned int)(i64>>32) schreiben könnte)

    Wenn ich eine andere Vorschlage, welche würde ich dann wohl wählen? 😮



  • Dravere schrieb:

    knivil schrieb:

    Nur der Vollstaendigkeit wegen: Der Weg ueber union ist wohl besser.

    Und undefiniert ...

    Ich hätte da ja ein "Oder" spendiert (statt eines "Und"). 😉


Anmelden zum Antworten