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.
Einchar
,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.
-
[[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
istmindestensexakt ein Byte lang.
Ein(unsigned) short
und ein(unsigned) int
ist mindestens2 Byte16 Bits lang.
Ein(unsigned) long
ist mindestens4 Bytes32 Bits lang.
Ein(unsigned) long long
ist mindestens8 Bytes64 Bits lang.Skym0sh0 schrieb:
D.h. für die Größe gilt:
char <= short <= int <= long <= long longNachtrag: 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.
-
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.
Einchar
,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
undint
mindestens 16,long
mindestens 32 undlong 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.
-
Hausaufgabe: Rausfinden wann sich die Betragsminima in limits.h etabliert haben.