Warum in C-Sprache muss für jeden vorzeichenbehafteten int-Typ ein entsprechender vorzeichenloser int-Typ vorhanden sein?

8

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) .

    
eddybudge 30.01.2018, 13:49
quelle

1 Antwort

5

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.

    
Lundin 30.01.2018, 14:20
quelle

Tags und Links