Ich habe C in Kürze gelesen und folgendes gefunden:
"Wenn ein optionaler signierter Typ (ohne das Präfix u) definiert ist, dann der entsprechende vorzeichenlose Typ (mit dem ursprünglichen u) ist erforderlich, und umgekehrt. "
Der Absatz bezieht sich auf Ganzzahlige Typen mit exakter Breite (C99) .
Weil die primitiven Datentypen von C mit signierten und unsignierten Versionen kommen. Aus der C99-Begründung erklären sie die Notwendigkeit für die inttypes/stdint
Typen wie folgt, C99 Begründung V5.10 7.8:
C89 gibt an, dass die Sprache vier vorzeichenbehaftete ganzzahlige Datentypen unterstützen soll, char, short, int und long, aber stellt sehr wenig Anforderung an ihre Größe anders als das int und kurz sein mindestens 16 Bit und lang mindestens so lang wie int und nicht kleiner als 32 Bits. Für 16-Bit-Systeme weisen die meisten Implementierungen 8, 16, 16 und 32 Bit dem Zeichen char zu, int bzw. lang. Für 32-Bit-Systeme ist es üblich, 8, 16, 32 und 32 Bits zu diesen Typen. Dieser Unterschied in der int-Größe kann einige Probleme für Benutzer verursachen, die Migrieren von einem System zu einem anderen System, das Integer-Typen unterschiedliche Größen zuweist, da die Inline-Promotion-Regel von Standard C unerwartete stille Änderungen erzeugen kann. Die Notwendigkeit, einen erweiterten Integer-Typ zu definieren, stieg mit der Einführung von 64-Bit-Systemen.
Der Zweck von
<inttypes.h>
besteht darin, eine Menge von Integer-Typen anzugeben, deren Definitionen sind Maschinenübergreifend konsistent und unabhängig von Betriebssystemen und anderen Implementierungen Idiosynkrasien. Es definiert über typedef Integer-Typen verschiedener Größen. Implementierungen können sie als Standard-C-Integer-Typen oder von ihnen unterstützte Erweiterungen frei definieren. Konsistent Die Verwendung dieses Headers erhöht die Portabilität eines Benutzerprogramms auf plattformübergreifende Weise erheblich.
Die Implementierung von inttypes/stdin
war mit typedef
möglich. Daher muss für jeden unterstützten primitiven Datentyp ein Typ mit fester Breite vorhanden sein.
Warum C zuerst Typen signiert hat, liegt daran, dass CPU: s sowohl vorzeichenbehaftete als auch vorzeichenlose Zahlenarithmetik unterstützt. Aber auch, da wir Integer-Typen verwenden möchten, um gespeicherte rohe Binärdaten auszudrücken: Der Typ unsigned char
/ uint8_t
ist die C-Sprache, die einem Byte von Rohdaten entspricht, die alles enthalten könnten. (Und aus diesem Grund können Zeichentypen keine Trap-Repräsentationen usw. enthalten.)
Aus dem C99-Standard selbst können wir einen ähnlichen Text wie in Ihrem Buch finden, C99 6.2.5 / 6:
Für jeden der vorzeichenbehafteten Integer-Typen gibt es einen entsprechenden (aber anderen) unsigned Integer-Typ (mit dem Schlüsselwort unsigned gekennzeichnet), der die gleiche Menge an verwendet Speicher (einschließlich Zeicheninformationen) und hat die gleichen Ausrichtungsanforderungen.