Verbreitung von Endianess



  • DrakoXP schrieb:

    wie groß sind die Datentypen bei 64 Bit überhaupt?
    [...Fragen über Fragen...]

    Du hättest ruhig mal dem Link folgen können, den ich gegeben hatte. 🙂

    Erstmal...
    C++ garantiert für jeden Ganzzahltypen eine bestimmte "Mindestgröße" -- nicht in Bytes, sondern bzgl des Wertebereichs darstellbarer Zahlen:

    Typ                 | kann garantiert diese Zahlen darstellen
    --------------------+----------------------------------------
    unsigned char:      | 0...2^8-1
    unsigned short:     | 0...2^16-1
    unsigned int:       | 0...2^16-1
    unsigned long:      | 0...2^32-1
    unsigned long long: | 0...2^64-1
    signed char:        |  -(2^7-1)...2^7-1
    signed short:       | -(2^15-1)...2^15-1
    signed int:         | -(2^15-1)...2^15-1
    signed long:        | -(2^31-1)...2^31-1
    signed long long:   | -(2^63-1)...2^63-1
    

    Beachte: long long ist offiziell noch kein C++.

    Wie das jetzt umgesetzt wird, ist Sache des Rechners, auf dem das C++-Programm laufen soll, des Compilerherstellers, der Betriebssystem-Schnittstellen-Konvention, etc etc. Es soll Rechner geben, bei denen ein int 36 Bit besitzt. Üblich ist das allerdings nicht mehr.

    Die Windowswelt hat sich eben auf das LLP64-Modell eingeschossen wobei sich in der Unix-Welt LP64 durchgesetzt. Der Unterschied: Bei LLP64 ist "long" noch 32bittig, bei LP64 ist es 64bittig.

    long long mit 128Bit ist theoretisch möglich ("standardkonform"), macht aber (zur Zeit) keiner.



  • ok, ich hab jetzt nochmal den Thread durchgeschaut und keinen Link gefunden O.o
    vllt hab ich ihna ber auch nur übersehen...

    naja, also wenn ich das richtig verstehe, sind das alles nur Richtlinien und wenn ich es genau wissen will,
    muss ich eben in der jeweiligen Doku vom Compiler wühlen...

    witzig ist eben, dass VC9 den Datentyp __int128 kennt, aber Compilerfehler bringt, wenn man diesen verwendet.
    Daher hatte ich die Annahme, dass dieser Typ bei 64Bit Kompilierung funktioniert 😉
    und da long long eben der größte Typ ist, den C++ mehr oder weniger unterstützt,
    müssten die ja dann equivalent sein.
    (es sei denn VC++ hat __int128 als komplett eigenen Typ für den es sonst nichts vergleichbares in C++ gibt...)

    und auch wenn long long nicht zum Standard gehört... ich hab noch keinen Compiler gesehen, der das nicht kennt...
    ok, bisher hab ich auch nur GCC und VC verwendet xD



  • DrakoXP schrieb:

    ok, ich hab jetzt nochmal den Thread durchgeschaut und keinen Link gefunden O.o
    vllt hab ich ihna ber auch nur übersehen...

    Er meinte das hier:

    senfer schrieb:

    Schon auf Linux 64-Bit probiert? Kann ich gerade nicht testen, da müsste aber test_byte==0 gelten, da dort ein long aus 64 Bit besteht (LP64-Modell).

    senfer schrieb:

    Es soll Rechner geben, bei denen ein int 36 Bit besitzt. Üblich ist das allerdings nicht mehr.

    hab gehört, dass bei einigen DSP-Prozessoren ints 24 Bit breit sind.

    senfer schrieb:

    Preisfrage ohne Preis: Wie müsste man eine Funktion bauen, welche eine vorzeichenbehaftete 32-Bit Zahl im Little-Endian & Zweierkomplement Format aus einem char-Puffer holt?

    signed long read_32bit_le_signed(unsigned char* woher)
    {
      ...
    }
    

    Versucht sie so portabel wie möglich hinzubekommen, ohne ein bestimmtes "implementation-defined behavior" vorauszusetzen. Als einzige Ausnahme sei CHAR_BIT==8 gegeben 🙂

    OK!

    "Ultra-Portabel" mit Deiner erlaubten Annahme CHAR_BIT==8:

    signed long read_32bit_le_signed(unsigned char* woher)
    {
      unsigned long u = woher[0] | (woher[1] <<  8)
              | (woher[2] << 16) | (woher[3] << 24);
      signed long s = static_cast<signed long>(u & 0x7FFFFFFFu);
      if (u & 0x80000000u) {
        s -= 1;
        s -= 0x7FFFFFFF;
      }
      return s;
    }
    

    Das funktioniert sogar, wenn die Maschine kein Zweierkomplement benutzt -- ausgenommen der Zahl -(2^31), die mit 31 Bit im Einerkomplement oder Sign+Magnitude nicht darstellbar ist.

    Gruß,
    SP


Anmelden zum Antworten