Heim > Backend-Entwicklung > C++ > Hauptteil

Auswahl eines geeigneten Ganzzahltyps in C und C++

DDD
Freigeben: 2024-09-13 10:15:06
Original
319 Leute haben es durchsucht

Choosing an Appropriate Integer Type in C and C++

Einführung

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.

Richtlinien

Hier sind meine Richtlinien für die Auswahl eines Ganzzahltyps:

  • Wenn Sie eine Anzahl von Bytes im Speicher darstellen, verwenden Sie den Standardtypalias size_t.

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 entweder die Größe oder eine Position innerhalb einer Datei auf der Festplatte darstellen, verwenden Sie den POSIX-Typ-Alias ​​„off_t“.

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.

  • Wenn Sie eine Anzahl von Objekten im Speicher darstellen, verwenden Sie auch size_t.

Dies ist auch der Typ, der sowohl von den C- als auch C++-Standardbibliotheken verwendet wird, z. B. von fread() und fwrite().

  • Nur ​​wenn Sie einen Wert darstellen müssen, der in einer bestimmten Anzahl von Bits enthalten ist, oder Sie einer bestimmten API entsprechen müssen, verwenden Sie einen der Typaliase int8_t, int16_t, int32_t oder int64_t für vorzeichenbehaftete Typen. oder einer der Typaliase uint8_t, uint16_t, uint32_t oder uint64_t für vorzeichenlose Typen.

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:

  • Andernfalls verwenden Sie entweder „unsigned short“, „unsigned“, „unsigned long“ oder „unsigned long long“ in ähnlicher Weise, wobei „unsigned“ bevorzugt wird, es sei denn, Sie benötigen entweder kleinere oder größere Werte.

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.

Abschluss

Die Auswahl des richtigen Ganzzahltyps übermittelt dem Leser korrekte Informationen und kann Laufzeitprüfungen überflüssig machen.

Epilog

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;
}
Nach dem Login kopieren

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()
Nach dem Login kopieren

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!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!