Bit-Reihenfolge


  • Administrator

    Grüsse zusammen,

    Bin mir grad bei etwas nicht mehr sicher und finde keine sichere passende Antwort.

    Sagen wir, wir haben einen 32-Bit Integer:

    0000 0000  0000 0000  0000 0100  1101 0010
    

    Wenn ich nun folgendes mache:

    int x; // Dieser integer
    
    char a = (x >> 24) & 0xFF;
    char b = (x >> 16) & 0xFF;
    char c = (x >> 8) & 0xFF;
    char d = x & 0xFF;
    

    Ist dann garantiert, dass folgendes immer gilt?

    a: 0000 0000
    b: 0000 0000
    c: 0000 0100
    d: 1101 0010
    

    Interessant fand ich, dass auf meinem System, dem so war, wenn ich allerdings das folgende machte, kam was anderes raus:

    char* pcBytes = reinterpret_cast<char*>(&x);
    
    char a = pcBytes[0];
    char b = pcBytes[1];
    char c = pcBytes[2];
    char d = pcBytes[3];
    
    a: 1101 0010
    b: 0000 0100
    c: 0000 0000
    d: 0000 0000
    

    Anders gesagt:
    Ist die Binärdarstellung im Gegensatz zur Bytereihenfolge garantiert?

    Danke im voraus.

    Grüssli



  • Dravere schrieb:

    Interessant fand ich, dass auf meinem System, dem so war, wenn ich allerdings das folgende machte, kam was anderes raus:

    char* pcBytes = reinterpret_cast<char*>(&x);
    
    char a = pcBytes[0];
    char b = pcBytes[1];
    char c = pcBytes[2];
    char d = pcBytes[3];
    
    a: 1101 0010
    b: 0000 0100
    c: 0000 0000
    d: 0000 0000
    

    Das hat soweit ich weiß etwas mit der art des speicherns zu tun.
    Stichwort: Little bzw. Big-Endian

    Dravere schrieb:

    Ist dann garantiert, dass folgendes immer gilt?

    Jap 🙂


  • Mod

    Die Antwort muss nein lauten auf einem System, bei dem char vorzeichenbehaftet ist und 8 bit hat. Dann ist nämlich die Initialisierung

    char d = x & 0xFF;
    

    undefiniert. Abgesehen davon besteht kein Problem - generell werden derartige Operation besser mit vorzeichenlosen Typen durchgeführt. Die Wertdarstellung von Standardintegertypen ist insoweit festgelegt, als sie eine Binärdarstellung ist (also z.B. kein BCD). Davon wird aber hier kein Gebrauch gemacht, denn es wird von vornherein nur mit Werten operiert.



  • Nein das gilt nicht immer, gilt zB nicht auf einem System das die Zahlen anders darstellt (wobei natürlich der großteil der pcs das so darstellt).

    Du kannst das aber unterscheiden indem du dir einen festen Wert den du kennst speicherst und kontrollierst welche Speicherdarstellung verwendet wird. Das erspart dir dann das aufwändigere Umrechnen von Dezimal auf Binärzahl per Hornerschema etc.


  • Administrator

    Also moment, wie jetzt?

    • Fencer, sagt ja.
    • camper, sagt ja, wenn gilt:
    int x; // Dieser integer
    
    unsigned char a = (x >> 24) & 0xFF;
    unsigned char b = (x >> 16) & 0xFF;
    unsigned char c = (x >> 8) & 0xFF;
    unsigned char d = x & 0xFF;
    
    • DaRpH, sagt nein.

    Wie wäre es mit Quellen? 🙂

    Grüssli


  • Mod

    Dravere schrieb:

    Wie wäre es mit Quellen? 🙂

    ist mir zu trivial für die Mühe 😉


  • Administrator

    camper schrieb:

    Dravere schrieb:

    Wie wäre es mit Quellen? 🙂

    ist mir zu trivial für die Mühe 😉

    Ist es zu unfair anderen gegenüber, wenn ich dir jetzt glaube, da ich immer das Gefühl hatte, dass du weisst, wovon du sprichst?
    Naja, oder wir könnten es so regeln, dass du mir sonst Schadensersatz gibst. Wenn du wirklich weisst, dass es stimmt, dann kannst du es ja garantieren, ohne eine Quelle zu nennen :p

    Grüssli



  • int nZahl = 31231; // ...
    int nSample = 0x03020100; // Um Speicherreihenfolge zu ermitteln
    
    char* pcBytes = reinterpret_cast<char*>(&nZahl);
    char* pcReihenfolge = reinterpret_cast<char*>(&nSample);
    
    char a = pcBytes[pcReihenfolge[0]];
    char b = pcBytes[pcReihenfolge[1]];
    char c = pcBytes[pcReihenfolge[2]];
    char d = pcBytes[pcReihenfolge[3]];
    

    Damit ist meiner Meinung nach die Reihenfolge auf allen Byteorientierten Systemen garantiert.


  • Mod

    Dravere schrieb:

    Wenn du wirklich weisst, dass es stimmt, dann kannst du es ja garantieren, ohne eine Quelle zu nennen

    Warum sollte ich das tun? Ein "Beweis durch Autorität" ist empirisch nutzlos und ich habe kein Interesse daran, Recht zu behalten, falls ich falsch liegen sollte.
    Ich bin gar nicht sicher ob DaRpH hier wirklich widersprochen hat, kann auch sein, dass er sich (nur) auf den zweiten Fall per Cast bezog.



  • Ja ist schon richtig ich hab mich nur auf den Cast bezogen.

    Die Sache mit Bit-Shift hab ich ausgeschlossen da bei 64bit Werten je nach Compiler Mist gebaut wird. Wobei das bei 32 Bit ja durchaus funktioniert.


  • Administrator

    camper schrieb:

    Warum sollte ich das tun? Ein "Beweis durch Autorität" ist empirisch nutzlos und ich habe kein Interesse daran, Recht zu behalten, falls ich falsch liegen sollte.

    War ja auch nur ein dummer Witz 😉

    camper schrieb:

    Ich bin gar nicht sicher ob DaRpH hier wirklich widersprochen hat, kann auch sein, dass er sich (nur) auf den zweiten Fall per Cast bezog.

    DaRpH schrieb:

    Ja ist schon richtig ich hab mich nur auf den Cast bezogen.

    Achso. Das mit dem Cast ist mir schon klar. Es ging mir nur um die Bitdarstellung, ob halt eben die funktioniert, da es ja bei der Bytedarstellung nicht funktioniert.

    DaRpH schrieb:

    Die Sache mit Bit-Shift hab ich ausgeschlossen da bei 64bit Werten je nach Compiler Mist gebaut wird. Wobei das bei 32 Bit ja durchaus funktioniert.

    Darf ich noch nochfragen, was das genau bedeutet?

    Grüssli



  • auf nem Motorola CPU ist umgekehrt^^

    Stichwort Byteorder



  • BorisDieKlinge schrieb:

    auf nem Motorola CPU ist umgekehrt^^

    Stichwort Byteorder

    Guten Morgen, das stand schon in der ersten Antwort.

    Hier ging es auch vor allem um Bit-Order.


Log in to reply