Der Unterschied von int8_t, int_least8_t und int_fast8_t?

Lesezeit: 7 Minuten

Was ist der Unterschied zwischen den int-Typen int8_t, int_least8_t und int_fast8_t?

  • Warum haben Sie eine falsche Antwort akzeptiert, wenn es hier ganz gute Antworten gibt?

    – Jim Balter

    10. März 2011 um 1:51 Uhr

  • Eigentlich jede einzelne Antwort hier außer die, die Sie akzeptiert haben, ist sowohl korrekt als auch informativ.

    – Jim Balter

    10. März 2011 um 1:57 Uhr


  • @ Jim, meine Antwort war falsch, aber nicht so falsch, dass jeder zu denken scheint. Das einzige, was ich falsch gemacht habe, war int_least8_t. Unabhängig davon habe ich es so bearbeitet, dass es richtig ist

    – Earlz

    10. März 2011 um 3:03 Uhr

  • @Earlz Mit anderen Worten, es war richtig in Bezug auf int8_t und falsch in Bezug auf alles andere. Was “jeder zu denken scheint”, wissen weder Sie noch ich, aber es kann nicht so viele geben, weil Ihre Antwort nicht annähernd die Anzahl von Ablehnungen erhalten hat, die sie haben sollte.

    – Jim Balter

    10. März 2011 um 4:14 Uhr

Der Unterschied wird in den von Carl Norum zitierten Abschnitten des C99-Standards definiert. Aber es kann nützlich sein, ein Beispiel zu haben.

Angenommen, Sie haben einen C-Compiler für ein 36-Bit-System mit char = 9 Bit, short = 18 Bit, int = 36 Bit und long = 72 Bit. Dann

  • int8_t ist nicht vorhandenweil es keine Möglichkeit gibt, die Bedingung des Habens zu erfüllen exakt 8 Wertbits ohne Auffüllen.
  • int_least8_t ist eine Typdefinition von char. Nicht von short oder intweil der Standard die verlangt am kleinsten Typ mit mindestens 8 Bit.
  • int_fast8_t kann alles sein. Es ist wahrscheinlich eine Typdefinition von int wenn die “native” Größe als “schnell” angesehen wird.

Aus dem Spec-Bereich 7.8.1.1 Integer-Typen mit exakter BreiteAbsatz 1:

Der Typedef-Name intN_t bezeichnet einen vorzeichenbehafteten ganzzahligen Typ mit der Breite N , ohne Füllbits und als Zweierkomplementdarstellung. Daher, int8_t bezeichnet einen vorzeichenbehafteten Integer-Typ mit einer Breite von genau 8 Bit.

Und von: 7.18.1.2 Ganzzahltypen mit minimaler BreiteAbsatz 1:

Der Typedef-Name int_leastN_t bezeichnet einen vorzeichenbehafteten Integer-Typ mit einer Breite von mindestens N, sodass kein vorzeichenbehafteter Integer-Typ mit geringerer Größe mindestens die angegebene Breite hat. Daher, int_least32_t bezeichnet einen vorzeichenbehafteten Integer-Typ mit einer Breite von mindestens 32 Bit.

Und schließlich ab 7.18.1.3 Schnellste Ganzzahltypen mit minimaler BreiteAbsatz 2:

Der Typedef-Name int_fastN_t bezeichnet den schnellsten vorzeichenbehafteten ganzzahligen Typ mit einer Breite von mindestens N. Der Typedef-Name uint_fastN_t bezeichnet den schnellsten vorzeichenlosen ganzzahligen Typ mit einer Breite von mindestens N.

Benutzeravatar von Jim Balter
Jim Balter

Hier ist eine konzeptionell einfache Antwort: Die Breite von int*N_t für alle drei Typen muss >= N sein. intN_t hat exakt N Bits, int_leastN_t ist die am wenigsten (schmalste) solcher Art, und int_fastN_t ist die am schnellsten solche Art.

Beispielsweise werden auf einer Maschine mit 8-Bit-Bytes und schnellen 32-Bit-Registern int8_t und int_least8_t als vorzeichenbehaftetes Zeichen bezeichnet, aber int_fast8_t wird als int32_t bezeichnet. Wenn die Implementierung sie jedoch definieren würde, würden int_least24_t und int_fast24_t beide als Alias ​​in int32_t verwendet, wobei int24_t undefiniert bliebe.

Bearbeiten: Wie Technophile unten betont, ist das eigentliche Problem für schnelle Typen der Speicher, nicht die Register (im Allgemeinen können Operationen mit den niederwertigen Bits von Registern genauso schnell durchgeführt werden wie mit dem gesamten Register). Zum Beispiel kann das Schreiben in ein int8_t im Speicher das Laden des 32-Bit-Wortes erfordern, das es enthält, nur das Byte ändern und es dann zurückschreiben, während es, wenn es in einem 32-Wort gespeichert wäre, ohne Lesen geschrieben werden könnte.

  • Erst nach dem Lesen Dies Antwort habe ich wurde mir der Bedeutung bewusst int_fastN_t Typen. N-Bit-Register. Es ist schmerzlich offensichtlich, aber aus einer objektorientierten Welt (Java) kommend ist es zunächst schwer zu erkennen (zumindest alleine).

    – Kohányi Robert

    12. November 2011 um 7:22 Uhr


  • @Kohányi Róbert: Es liegt nicht daran, dass Java objektorientiert ist (auch C++). es liegt daran, dass Java maschinenunabhängig (abstrakt) ist. Aus diesem Grund ist der Begriff “Register” in Java ziemlich bedeutungslos (und auch verboten).

    – Benutzer1284631

    21. Oktober 2012 um 19:13 Uhr

  • @axeoth Du hast Recht, dass es nichts damit zu tun hat, objektorientiert zu sein, aber der ganze Sinn dieser Typen, insb. die kleinste und schnellste Version, ist Maschinenunabhängigkeit. Java ist tatsächlich maschinenabhängiger, weil seine int-Typen KONKRETE sind – sie haben vordefinierte und feste Größen … es ist unmöglich, Java auf einer Maschine ohne 8-Bit-Bytes zu implementieren. Und die Frage der Register ist nicht relevant … Register sind nicht Teil des C-Speichermodells und das Schlüsselwort “register” wird von den meisten Compilern ignoriert, aber C- und Java-Compiler generieren natürlich beide Registercode.

    – Jim Balter

    21. Oktober 2012 um 19:33 Uhr

  • @Kohányi Róbert: Dies könnte mit Speicherzugriffen zusammenhängen. Angenommen, der Speicher besteht aus 64-Bit-Wörtern. Überlegen Sie, wie ein 8-, 16- oder 32-Bit-Wert in einen Speicherort geschrieben werden würde: Der Prozessor muss möglicherweise den Speicher lesen, die gewünschten Bits ändern und dann einen 64-Bit-Wert schreiben, während ein 64-Bit-Wert geschrieben werden könnte in einem einzigen Zugriff.

    – Technikbegeistert

    28. Juli 2014 um 21:34 Uhr

  • Dies ist die einzige Antwort, die sogar versucht hat, die Frage zu beantworten, für die ich hierher gekommen bin, um beantwortet zu werden. Daher bin ich überrascht, dass sie nicht mehr positiv bewertet wurde. Ich vermutete, dass dies der Sinn von “schnell” war, aber ich wollte sichergehen, also danke ich Ihnen allen für die Bestätigung, dass es mit CPU-Betrieb und RAM-Zugriffsdetails zusammenhängt.

    – RTHarston

    20. Januar 2020 um 19:56 Uhr

intN_t (und uintN_t) ist nicht in allen C99-Implementierungen erforderlich. Diese Typen sind die “Ganzzahltypen mit exakter Breite”. Sie werden in Implementierungen benötigt, in denen es sinnvoll ist, sie zu haben (im Grunde jeder Desktop-Computer).

int_leastN_t ist in allen C99-Implementierungen für N-Werte von 8, 16, 32 und 64 erforderlich. Dies sind die “Ganzzahltypen mit minimaler Breite”.

int_fastN_t ist in allen C99-Implementierungen für Werte von N von 8, 16, 32 und 64 erforderlich. Dies ist der “schnellste ganzzahlige Typ mit minimaler Breite”.

Hogans Benutzeravatar
Hogan

Diese beziehen sich auf die Größe der Ganzzahl und klingen genau so, wie sie sich anhören.

int8_t is exactly 8 bits
int_least8_t is the smallest int type that has at least 8 bits
int_fast8_t is the fastest int type that has at least 8 bits.

  • Dies dient nicht wirklich dazu, den Unterschied zu erklären, um den es in der ursprünglichen Frage ging.

    – Konrad Meyer

    10. März 2011 um 1:48 Uhr

  • @Jim Balter: Was ist der Unterschied zwischen int_least8_t und int_fast8_t nach dieser antwort, huh?

    – Konrad Meyer

    10. März 2011 um 4:57 Uhr

  • @Conrad In der Antwort fehlen lediglich die Worte “ist der kleinste Typ, der” aus der zweiten Zeile. Hm.

    – Jim Balter

    10. März 2011 um 5:44 Uhr

  • @Conrad Ja, das stimmt. Was, Sie haben erwartet, dass int_least8_t lang lang sein könnte? int8_t wird als exakt erklärt, int_fast8_t wird als am schnellsten erklärt; das erklärt 2/3 des unterschiedes. Die Erklärung für int_least8_t ist fehlerhaft, aber leicht herauszufinden, wenn man die aufwendet am wenigsten Aufwand.

    – Jim Balter

    10. März 2011 um 6:38 Uhr


  • @Conrad Und übrigens, die akzeptierte Antwort, über die das OP schrieb: “Das erklärt wirklich, warum sie überhaupt existieren”, war grob falsch, als sie akzeptiert wurde, und still, hat auch nach der Bearbeitung denselben Fehler, von dem Sie behaupten, dass dies nicht dazu dient, “den Unterschied zu erklären”. Die kritischen Kommentare zu dieser Antwort machen sich die Mühe, darauf hinzuweisen, was daran falsch ist.

    – Jim Balter

    10. März 2011 um 6:55 Uhr

  • Dies dient nicht wirklich dazu, den Unterschied zu erklären, um den es in der ursprünglichen Frage ging.

    – Konrad Meyer

    10. März 2011 um 1:48 Uhr

  • @Jim Balter: Was ist der Unterschied zwischen int_least8_t und int_fast8_t nach dieser antwort, huh?

    – Konrad Meyer

    10. März 2011 um 4:57 Uhr

  • @Conrad In der Antwort fehlen lediglich die Worte “ist der kleinste Typ, der” aus der zweiten Zeile. Hm.

    – Jim Balter

    10. März 2011 um 5:44 Uhr

  • @Conrad Ja, das stimmt. Was, Sie haben erwartet, dass int_least8_t lang lang sein könnte? int8_t wird als exakt erklärt, int_fast8_t wird als am schnellsten erklärt; das erklärt 2/3 des unterschiedes. Die Erklärung für int_least8_t ist fehlerhaft, aber leicht herauszufinden, wenn man die aufwendet am wenigsten Aufwand.

    – Jim Balter

    10. März 2011 um 6:38 Uhr


  • @Conrad Und übrigens, die akzeptierte Antwort, über die das OP schrieb: “Das erklärt wirklich, warum sie überhaupt existieren”, war grob falsch, als sie akzeptiert wurde, und still, hat auch nach der Bearbeitung denselben Fehler, von dem Sie behaupten, dass dies nicht dazu dient, “den Unterschied zu erklären”. Die kritischen Kommentare zu dieser Antwort machen sich die Mühe, darauf hinzuweisen, was daran falsch ist.

    – Jim Balter

    10. März 2011 um 6:55 Uhr

1416410cookie-checkDer Unterschied von int8_t, int_least8_t und int_fast8_t?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy