2015-01-27 5 views
6

Aus ISO/IEC 9899:Wofür sind die Integer-Typen der minimalen Breite nützlich?

7.18.1.2 Mindestbreiten-Integer-Typ

1 Der typedef Name int_leastN_t bezeichnet einen vorzeichenbehaftete Ganzzahl-Typen mit einer Breite von zumindest N, so dass keine Ganzzahl mit Vorzeichen Typ mit geringerer Größe hat mindestens die angegebene Breite. Daher bezeichnet int_least32_t einen vorzeichenbehafteten Integer-Typ mit einer Breite von mindestens 32 Bit.

Warum sollte ich jemals diese Typen verwenden?

Wenn ich entscheide, welchen Typ ich für eine Variable brauche, die ich brauche, dann frage ich mich: "Was wird der größte Wert sein, den es jemals tragen könnte?"

Also werde ich eine Antwort finden, überprüfen Sie, was ist die niedrigste 2 n, die größer ist als das, und nehmen Sie die passende genaue Integer-Typ.

Also könnte ich in diesem Fall auch einen Integer-Typ mit minimaler Breite verwenden. Aber warum? Wie ich bereits weiß: Es wird niemals ein größerer Wert sein. Warum also etwas nehmen, das manchmal noch mehr abdecken könnte, als ich brauche?

alle anderen Fälle I, wo sogar ungültig wie zB imagin kann:

„Ich habe eine Art, die mindestens eine Größe von ... sein“ - Die implmentation kann nicht wissen, was die größten sein wird (Zum Beispiel) Benutzereingaben werde ich jemals bekommen, so dass die Anpassung des Typs zur Kompilierzeit nicht hilft.

"Ich habe eine Variable, bei der ich nicht bestimmen kann, welche Größe der Werte die Laufzeit hält."

-So, wie der Compiler zur Kompilierzeit wissen kann? -> Es kann auch nicht die passende Byte-Größe finden.

Also was ist die Verwendung dieser Typen?

Antwort

5

Da Ihr Compiler am besten weiß, was gut für Sie ist. Auf einigen CPU-Architekturen können beispielsweise Berechnungen mit 8 oder 16 Bit-Typen viel langsamer sein als Berechnungen in 32 Bit, da zusätzliche Befehle zum Maskieren von Operanden und Ergebnissen zum Anpassen ihrer Breite erforderlich sind.

Die C-Implementierung auf einem Cray Unicos zum Beispiel hat nur einen 8-Bit-char-Typ, alles andere (kurz, int, lang, lang lang) ist 64 Bit. Wenn Sie einen Typ zwingen, int16_t oder int32_t zu sein, kann die Leistung aufgrund der engen Speicher drastisch leiden, die Maskierung, oring und anding erfordern. Wenn Sie int_least32_t verwenden, kann der Compiler den nativen 64-Bit-Typ verwenden.

+0

Upvote zum Bearbeiten. Ich wusste nicht, dass "intN_t" -Typen tatsächlich in Software emuliert werden können, wenn sie nicht anderweitig verfügbar sind. – user694733

+4

@Jens und warum sollte ich int_least32_t anstelle von int_fast32_t für diesen Zweck verwenden? – dhein

+0

@Zaibis Weil Platzeffizienz statt Geschwindigkeit Ihre Priorität sein könnte. – Jens

5

Warum also etwas nehmen, das manchmal noch mehr abdecken könnte, als ich brauche?

Da ist nicht immer die Größe, die Sie benötigen. Zum Beispiel auf System, wo CHAR_BIT > 8, int8_t nicht verfügbar ist, aber int_least8_t ist.

Idee ist nicht, dass Compiler raten wird, wie viel Bits Sie brauchen. Die Idee ist, dass der Compiler immer einen Typ zur Verfügung haben wird, der Ihre Größenanforderungen erfüllt, auch wenn er keinen genauen Größentyp bieten kann.

+0

Würde es in diesem Fall zum Beispiel ein uint10_t geben, wenn charbit 10 wäre? Also ist es nur aus Portabilitätsgründen, dass ich den Wert von CHAR_BIT nicht selbst überprüfen muss und nicht iofdefs entsprechen muss? und gibt es Systeme in der Praxis, wo CHAR_BIT> 8 ist? – dhein

+3

Alle "intN_t" -Typen sind auf Nicht-2-Komplementärsystemen optional. Sie sind also nicht wirklich nützlich für portablen Code. Aber "uint10_t" ist standardmäßig zulässig (N1570: 7.20.1.1.2). Ich glaube, es gibt Systeme, bei denen CHAR_BIT> 8 ist, aber ich kann mich nicht erinnern, wie relevant sie heute sind. – user694733

+1

Heutzutage Systeme mit CHAR_BIT> 8 sind hauptsächlich DSPs http://stackoverflow.com/questions/2098149/what-platforms-have-etwas-ande-8-bit-char?lq=1 –