uint8_t oder short unsigned int ?



  • Hey Leute

    Wie ihr schon im Titel erkennen könnt stelle ich mir sehr häufig die Frage wann
    und ob ich überhaupt Datentypen aus der <cstdint> verwenden soll. Als Beispiel
    wo liegt der unterschied zwischen einem int und einem int32_t



  • Ein std::int32_t ist 32 Bit, also 4 Byte, groß.

    Ein "normaler" int erfüllt da keine Garantien, ausser dass er größer als char ist. Aber je nach Plattform hast du keine Garantien, ob du mit 16, 32 oder 64 oder mit sosntwas hantierst.



  • Skym0sh0 schrieb:

    Ein "normaler" int erfüllt da keine Garantien, ausser dass er größer als char ist.

    Doch. int ist mindestens 16 Bit.



  • Und mindestens so gross wie ein short.



  • Jop, ich weis, aber war zu faul viel zu schreiben xD

    N3242 3.9.1 2 schrieb:

    There are five standard signed integer types : “ signed char ”, “ short int ”, “ int ”, “ long int ”, and “ long long int ”. In this list, each type provides at least as much storage as those preceding it in the list.

    D.h. für die Größe gilt:
    char <= short <= int <= long <= long long



  • Sollen wir weiterspielen?

    Ein Byte hat mindestens 8 Bit.
    Ein char , char signed , char unsigned ist mindestens ein Byte lang.
    Ein (unsigned) short und ein (unsigned) int ist mindestens 2 Byte lang.
    Ein (unsigned) long ist mindestens 4 Bytes lang.
    Ein (unsigned) long long ist mindestens 8 Bytes lang.


  • Mod

    [[un]signed] char ist genau ein Byte gross. Immer.



  • Swordfish schrieb:

    Ein Byte hat mindestens 8 Bit.

    Heute dürften es wohl immer genau 8 Bit sein. Als aber C entwickelt wurde waren auch weniger als 8 gebräuchlich.



  • Swordfish schrieb:

    Ein (unsigned) short und ein (unsigned) int ist mindestens 2 Byte lang.
    Ein (unsigned) long ist mindestens 4 Bytes lang.
    Ein (unsigned) long long ist mindestens 8 Bytes lang.

    Alles falsch.
    Wie kommst du auf die Idee?



  • Swordfish schrieb:

    Ein char , char signed , char unsigned ist mindestens exakt ein Byte lang.
    Ein (unsigned) short und ein (unsigned) int ist mindestens 2 Byte 16 Bits lang.
    Ein (unsigned) long ist mindestens 4 Bytes 32 Bits lang.
    Ein (unsigned) long long ist mindestens 8 Bytes 64 Bits lang.

    Skym0sh0 schrieb:

    D.h. für die Größe gilt:
    char <= short <= int <= long <= long long

    Nachtrag: Ein char immer ein Byte groß. Dieses Byte ist kein Computerbyte, sondern ein C++-Byte. Die Größe eines Typen in C++-Bytes liefert sizeof zurück. sizeof char liefert immer 1. Auch auf Plattformen wo char 4 Byte groß ist. Das Ergebnis von sizeof hat also nicht zwangsläufig etwas mit der echten Größe des Typen zu tun.



  • hustbaer schrieb:

    Swordfish schrieb:

    Ein (unsigned) short und ein (unsigned) int ist mindestens 2 Byte lang.
    Ein (unsigned) long ist mindestens 4 Bytes lang.
    Ein (unsigned) long long ist mindestens 8 Bytes lang.

    Alles falsch.
    Wie kommst du auf die Idee?

    Wie kommst du auf die Idee, dass das von Swordfisch falsch sein könnte?



  • quarkmalwiederleider schrieb:

    hustbaer schrieb:

    Swordfish schrieb:

    Ein (unsigned) short und ein (unsigned) int ist mindestens 2 Byte lang.
    Ein (unsigned) long ist mindestens 4 Bytes lang.
    Ein (unsigned) long long ist mindestens 8 Bytes lang.

    Alles falsch.
    Wie kommst du auf die Idee?

    Wie kommst du auf die Idee, dass das von Swordfisch falsch sein könnte?

    Es gibt Platformen mit sizeof(long)==1. Auf denen hat ein Byte dann halt mehr als 8 Bit.



  • quarkmalwiederleider schrieb:

    hustbaer schrieb:

    Swordfish schrieb:

    Ein (unsigned) short und ein (unsigned) int ist mindestens 2 Byte lang.
    Ein (unsigned) long ist mindestens 4 Bytes lang.
    Ein (unsigned) long long ist mindestens 8 Bytes lang.

    Alles falsch.
    Wie kommst du auf die Idee?

    Wie kommst du auf die Idee, dass das von Swordfisch falsch sein könnte?

    Siehe meinen Nachtrag.


  • Mod

    Das Ergebnis von sizeof hat also nicht zwangsläufig etwas mit der echten Größe des Typen zu tun.

    Doch, es wird die platformunabhängige Einheit C++-Byte verwendet. Was soll überhaupt die "echte" Größe sein? Wenn ein Stab einen Meter lang ist, und eine Funktion dir 1000 Millimeter gibt, ist das plötzlich nicht die echte Größe?

    Die einzigen Typen für die tatsächlich nicht die echte Größe zurückgegeben wird (weil das keinen Sinn macht) sind Referenzen.



  • Arcoth schrieb:

    Das Ergebnis von sizeof hat also nicht zwangsläufig etwas mit der echten Größe des Typen zu tun.

    Doch, es wird die platformunabhängige Einheit C++-Byte verwendet. Was soll überhaupt die "echte" Größe sein? Wenn ein Stab einen Meter lang ist, und eine Funktion dir 1000 Millimeter gibt, ist das plötzlich nicht die echte Größe?

    Hast du meinen ganzen Nachtrag überhaupt gelesen oder habe ich das zu schlecht erklärt?

    Gut, "echte" war vielleicht ein wenig unpassend gewählt.



  • omfg.

    Swordfish schrieb:

    Ein Byte hat mindestens 8 Bit.
    Ein char , char signed , char unsigned ist mindestens ein übliches 8-bit Byte lang.
    Ein (unsigned) short und ein (unsigned) int ist mindestens 2 übliche 8-bit Byte lang.
    Ein (unsigned) long ist mindestens 4 übliche 8-bit Bytes lang.
    Ein (unsigned) long long ist mindestens 8 übliche 8-bit Bytes lang.



  • Swordfish schrieb:

    omfg.

    Das du das weißt, wissen wir.
    Es geht um den TE und andere Leser.



  • Swordfish schrieb:

    omfg.

    OMFG, ja.
    Wenn du mit "ein Byte hat mindestens 8 Bit" anfängst, und es um C++ geht, dann ist die Annahme wohl nicht verkehrt dass du von einem C++ Byte redest. Und dann sind die folgenden Definitionen eben falsch.

    Und wenn du ein "übliches Byte" meinst, dann ist das "ein Byte hat mindestens 8 Bit" zumindest total irreführend. Denn ein "übliches Byte" hat genau 8 Bit, nicht mindestens 8.

    Und auf Architekturen wo ein Byte z.B. 16 oder 24 Bit hat, gelten die folgenden Definitionen (so wie du sie ursprünglich formuliert hast - also int mindestens 2 Byte etc.) auch nicht.

    Aber wieso überhaupt alles so kompliziert machen?
    char hat mindestens 8 Bit, short und int mindestens 16, long mindestens 32 und long long mindestens 64.
    Was ist daran so kompliziert dass man es "einfacher" (und damit falsch) machen müsste?



  • manni66 schrieb:

    Swordfish schrieb:

    Ein Byte hat mindestens 8 Bit.

    Heute dürften es wohl immer genau 8 Bit sein. Als aber C entwickelt wurde waren auch weniger als 8 gebräuchlich.

    Thaaa. Ein Standard C Byte hat genauso wie ein Standard C++ Byte mindestens 8 bit. Immer.


  • Mod

    Hausaufgabe: Rausfinden wann sich die Betragsminima in limits.h etabliert haben.


Anmelden zum Antworten