In this answer und die beigefügten Bemerkungen machen Pavel Minaev das folgende Argument, dass in C, um die einzigen Typen, die uint8_t
typedef'd char
und unsigned char
sind werden kann. Ich sehe this draft des C-Standards.Kann uint8_t ein Nicht-Zeichen-Typ sein?
- Die Anwesenheit von
uint8_t
impliziert das Vorhandensein eines entsprechenden Typsint8_t
(7.18.1p1). int8_t
ist 8 Bit breit und hat keine Padding-Bits (7.18.1.1p1).- Entsprechende Typen haben die gleiche Breite (6.2.5p6), also
uint8_t
ist auch 8 Bit breit. unsigned char
istCHAR_BIT
Bits breit (5.2.4.2.1p2 und 6.2.6.1p3).CHAR_BIT
ist mindestens 8 (5.2.4.2.1p1).CHAR_BIT
ist höchstens 8, weil entwederuint8_t
unsigned char
ist, oder es ist eine nicht-unsigned char
, nicht-Bit-Halbbild-Typ, dessen Breite ein Vielfaches vonCHAR_BIT
(6.2.6.1p4).
auf dieses Argument stimme ich, dass, wenn uint8_t
vorhanden ist, dann sowohl sie als auch unsigned char
identische Darstellungen haben: 8 Wert Bits und 0 Füllbits. Dies scheint sie nicht zu zwingen, vom gleichen Typ zu sein (z. B. 6.2.5p14).
Ist es erlaubt, dass uint8_t
in eine ausgefahrene unsigned integer Typ typedef'd wird (6.2.5p6) mit der gleichen Darstellung wie unsigned char
? Sicherlich muss es typedef'd (7.18.1.1p2) sein, und es kann kein anderer vorzeichenloser Integer-Typ sein als unsigned char
(oder char
, wenn es unsigniert ist). Dieser hypothetische erweiterte Typ wäre kein Zeichentyp (6.2.5p15) und würde daher keinen Alias-Zugriff auf ein Objekt eines inkompatiblen Typs (6.5p7) zulassen, was für mich der Grund ist, warum ein Compiler-Schreiber dies tun möchte Ding.
keine Antwort auf Ihre ausdrückliche Frage verwendet, aber es ist möglich, dass 'char 'ist ein vorzeichenloser Typ, dann könnte' uint8_t' in 'char' anstelle von' u typedef'ed sein nsigned char'. –
An einem Punkt (vor einigen Jahren) gab es im GCC-Projekt eine ernsthafte Diskussion über das Hinzufügen eines erweiterten Integertyps mit exakt den Eigenschaften, die Sie beschreiben - acht Bit breit, kein Zeichentyp und kein Sonderfall im Typ Alias-Analyse - aber soweit ich weiß, ging es nie irgendwo hin, und es gab keinen Hinweis darauf, dass es der zugrunde liegende Typ für "uint8_t" war (möglicherweise nur weil niemand zu der Zeit daran dachte). – zwol
Beachten Sie, dass 'uint8_t' überhaupt nicht existieren muss. Es ist nur bedingt definiert. –