Als Dennis Ritchie C erstellte, machte er int (einen vorzeichenbehafteten Ganzzahltyp) zum Standardtyp. Die Größe (Anzahl der Bits) eines int wurde bewusst nicht angegeben. Selbst als C standardisiert wurde, war alles, was garantiert wurde, eine Mindestgröße. Der Grundgedanke war, dass die Größe von int die „natürliche“ Wortgröße für eine Ganzzahl auf einer bestimmten CPU sein sollte.
Wenn Sie nur kleinere vorzeichenbehaftete Ganzzahlen benötigten und etwas Platz sparen wollten, gab uns Ritchie short; oder, wenn Sie größere ganze Zahlen brauchten, gab er uns long. (C99 gab uns mit long long sogar noch größere Ganzzahlen.) Wenn Sie nur vorzeichenlose Ganzzahlen benötigen, können Sie unsigned in eine Deklaration aufnehmen. C99 gab uns auch vorzeichenbehaftete Integer-Typ-Aliase bestimmter Größe (z. B. int32_t) und vorzeichenlose Typ-Aliase (z. B. uint32_t).
In der Programmierung werden jedoch negative Ganzzahlen (die daher einen vorzeichenbehafteten Ganzzahltyp erfordern) meistens nicht benötigt. Die Länge von Zeichenfolgen, die Anzahl der Objekte, die Größe von Objekten, die Größe von Dateien usw. sind allesamt vorzeichenlose Ganzzahlen. Typaliase bestimmter Größe werden noch weniger benötigt als vorzeichenbehaftete Ganzzahlen.
Trotzdem habe ich viel Code gesehen, der Integer-Typen unangemessen verwendet. Ein solcher Code kann den Lesern (einschließlich Ihnen selbst in einigen Monaten) entweder unzureichend spezifizierte oder irreführende Informationen vermitteln. Am besten wählen Sie den richtigen Integer-Typ für den richtigen Zweck.
Hier sind meine Richtlinien für die Auswahl eines Ganzzahltyps:
Dies ist der Typ, der sowohl von den C- als auch C++-Standardbibliotheken verwendet wird, z. B. von memcpy(), strlen(), std::string::size() usw., es gibt also viele Präzedenzfälle.
Wenn Sie mit sehr großen Dateien arbeiten, müssen Sie auf einigen Plattformen möglicherweise mit -D_FILE_OFFSET_BITS=64 kompilieren, um eine 64-Bit-Version von off_t zu erhalten.
Dies ist auch der Typ, der sowohl von den C- als auch C++-Standardbibliotheken verwendet wird, z. B. von fread() und fwrite().
Normalerweise benötigen Sie eine Ganzzahl fester Größe nur dann, wenn Sie einen Wert „externalisieren“, z. B. ihn auf die Festplatte schreiben oder über einen Socket senden.
Die Verwendung einer Ganzzahl fester Größe, wenn Sie eigentlich keine bestimmte Anzahl von Bits benötigen, übermittelt falsche Informationen an den Leser.
Außerdem:
Bei der Darstellung eines ganzzahligen Werts, der die exakte Größe eines Zeigers haben muss, verwenden Sie entweder den Standardalias intptr_t oder uintptr_t.
Nur wenn Sie negative Werte benötigen, verwenden Sie einen von short, int, long oder long long, wobei int bevorzugt wird, es sei denn, Sie benötigen entweder kleinere oder größere Werte.
Zuletzt:
Das heißt, es sei denn, Sie haben es mit einem der oben aufgeführten Fälle zu tun, verwenden Sie standardmäßig vorzeichenlose Typen.
Die Auswahl des richtigen Ganzzahltyps übermittelt dem Leser korrekte Informationen und kann Laufzeitprüfungen überflüssig machen.
Ursprünglich und bis C99 war int der implizite Typ, das heißt, wenn Sie überhaupt keinen Typ angaben, wurde es als int verstanden. Zum Beispiel:
power( x, n ) /* x and n are int; returns int */ { int p; for ( p = 1; n > 0; --n ) p *= x; return p; }
definiert eine Funktion, die int-Parameter hat und int zurückgibt, in der Deklaration wird int jedoch nicht verwendet.
Funktionsprototypen wurden von C++ nach C89 zurückportiert, die ursprünglichen Funktionsdefinitionen im „K&R-Stil“ waren jedoch noch bis C23 zulässig. Das ANSI C-Komitee ist eine konservative Gruppe.
Noch seltsamer ist, dass int vor C99 auch implizit in Deklarationen erlaubt war, wie zum Beispiel:
i; // int i *p; // int *p *a[4]; // int *a[4] *f(); // int *f()
Glücklicherweise sind solche Erklärungen längst illegal.
Das obige ist der detaillierte Inhalt vonAuswahl eines geeigneten Ganzzahltyps in C und C++. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!