C - ByteOrder



  • Hallo,

    als kleine Übung möchte ich eine eigene BigInteger-Klasse schreiben. Nach den ersten Überlegungen stellt sich eine Frage, die ich mir nicht beanworten kann. Da mein Laptop nur LittelEndian kann, ist sie von keiner großer Bedeutung. Also reines Interesse.

    Wann und bei welchen Operation muss ich auf Byte-Order achten?

    int i = 0xFF030000; // Wird dies vom Compiler richtig interpretiert?
    int b(5);
    
    int res;
    res = i + b; // OK
    res = i >> 20; // ?
    res = i | b; // ?
    res = i & 0x0FFF0000 // ?
    

    Oder muss ich nur beim lesen aus Dateien sowie Netzwerkstreams darauf achten?



  • ThomasEnzinger schrieb:

    Oder muss ich nur beim lesen aus Dateien sowie Netzwerkstreams darauf achten?

    richtig. shiften, arithmetische operationen, bitoperationen usw. sind unabhängig von der byte order (innerhalb des programms jedenfalls). aber multibyte-werte die woanders herkommen, könnten gedreht sein. auch solche faxen wie eine union aus einem int und einem char-array, um auf einzelne bytes zuzugreifen, können für überraschungen sorgen (aber das sollteste sowieso nicht machen, wegen undefiniertem verhalten oder so).
    🙂



  • Innerhalb deines C Programms brauchst du nicht auf die Byte-Order zu achten, das macht der Compiler schon richtig (solange du konsequent den selben Datentyp benutzt, also int).

    Nur beim expliziten Zugriff mittels eines char-Zeigers siehst du den Unterschied:

    int x = 0x12345678;
    char *px = (char *)&x;
    char c = *px; // je nach Byte-Order erhälst du 0x12 oder 0x78
    

    Du brauchst dich demnach also nur beim Datenaustausch um die richtige Reihenfolge kümmern. Für die byte-order-unabhängige Übertragung übers Netz gibt es dann die Funktionen ntohl() und htonl() (bzw. für short: ntohs() und htons()).



  • Danke für eure Antworten. Echt klasse hier 🙂

    Nur zur Kontrolle, folgendes funktioniert ebenso

    int a = 0x12003456;
    long b = (int) a;
    
    int* c = new int(100);
    char* f = (char*) c; // Dies führt zu einer ungewünschten Aktion
    
    // Funzt das auf CPP Ebene?
    int& x = *(new int(100));
    char& y = (char&) x;
    
    // Oder wie kann ich ein Down-Cast in C durchführen?
    


  • @thomas: ^^das sieht nach c++ aus. in C dürfte nicht viel davon compilieren.
    'downcast' kenne ich nur im zusammenhang mit vererbung, C hat sowas nicht. aber wenn du in C z.b. einen int* in einen char* castest, sind dereferenzierungen dieses char-pointers undefiniert (nehme ich mal an). jedenfalls sind sogar abstürze möglich, weil die alignments von 'int' und 'char' verschieden sein könnten.
    🙂


Anmelden zum Antworten