Wann sollte man kurz anstelle von int verwenden?

9

Zwei Anwendungsfälle, für die ich short in Betracht ziehen würde:

  1. Ich möchte einen Integer-Typ, der mindestens 16 Bit groß ist
  2. Ich möchte einen Integer-Typ, der genau 16 Bit groß ist

Da im ersten Fall int garantiert mindestens 16 Bit ist und der effizienteste Integraldatentyp ist, würde ich int verwenden. Im zweiten Fall, da der Standard nicht garantiert, dass short genau 16 Bit groß ist, würde ich stattdessen int16_t verwenden. Was ist also kurz?

    
manny 20.04.2012, 22:49
quelle

5 Antworten

7

Es gibt keinen Grund, short in einer C99-Umgebung mit 16-Bit-Ganzzahlen zu verwenden. Sie können stattdessen int16_t , int_fast16_t oder int_least16_t verwenden.

Die Hauptgründe für die Verwendung von short sind Abwärtskompatibilität mit C89 oder älteren Umgebungen, die diese Typen nicht bieten, oder Bibliotheken, die short als Teil ihrer öffentlichen API verwenden, um <stdint.h> selbst oder für Kompatibilität mit Plattformen, die keine 16-Bit-Ganzzahlen haben, sodass ihre C-Compiler kein int16_t bereitstellen.

    
Fred Foo 20.04.2012, 23:01
quelle
3

ISO / IEC 9899: 1999 (C99) fügt Header <stdint.h> und <inttypes.h> , das, was Sie brauchen:

  • int16_t ist möglicherweise nicht definiert, aber wenn es einen 16-Bit- (genau) Integer-Typ in der Implementierung gibt, ist int16_t ein Alias ​​dafür.
  • int_least16_t ist ein Typ, der der kleinste Typ ist, der mindestens 16 Bit enthält. Es ist immer verfügbar.
  • int_fast16_t ist der schnellste Typ, der mindestens 16 Bit enthält. Es ist immer verfügbar.

Ähnlich für andere Größen: 8, 16, 32, 64.

Es gibt auch intmax_t für den maximalen Integer-Typ. Natürlich gibt es auch einen vorzeichenlosen Typ für jede von diesen: uint16_t etc.

Diese Typen sind auch in C2011 vorhanden. Sie waren in C89 oder C90 nicht anwesend. Ich glaube jedoch, dass die Header in irgendeiner Form für die meisten Compiler verfügbar sind, sogar für solche wie MS Visual C, die nicht behaupten, C99 zu unterstützen.

Beachten Sie, dass ich Links zu den POSIX 2008-Versionen der Header <stdint.h> und <inttypes.h> angegeben habe. POSIX erlegt der Implementierung Regeln auf, die der C-Standard nicht erfüllt:

  

§7.18.1.1 Ganzzahlige Typen mit exakter Breite

     

¶1 Der Typdef-Name int N _t bezeichnet einen Typ mit vorzeichenbehafteten Integerwerten mit der Breite N, ohne Auffüllung   Bits und eine Zweierkomplementdarstellung. Somit bezeichnet int8_t eine ganze Zahl mit Vorzeichen   Typ mit einer Breite von genau 8 Bits.

     

¶2 Der Typdef-Name uint N _t bezeichnet einen vorzeichenlosen Integer-Typ mit der Breite N.    uint24_t bezeichnet einen vorzeichenlosen Integer-Typ mit einer Breite von genau 24 Bits.

     

¶3 Diese Typen sind optional. Wenn jedoch eine Implementierung Integer-Typen mit bereitstellt   Weiten von 8, 16, 32 oder 64 Bits, soll es die entsprechenden typedef Namen definieren.

    
Jonathan Leffler 20.04.2012 22:59
quelle
1

Ja, wenn Sie eine bestimmte Datengröße wirklich wollen, verwenden Sie int16_t, int32_t usw.

int16_t ist normalerweise ein plattformspezifischer typedef von short (oder was auch immer auf 16 Bits abgebildet wird). Auf einer 32-Bit-Maschine kann int16_t als kurz typedef angegeben werden, auf einer 16-Bit-Maschine kann int16_t typedef als int.

sein     
TJD 20.04.2012 22:55
quelle
0

Wenn Sie ein sehr großes Array haben, können Sie Shorts verwenden.

Sie können sie nützlich finden, um Teile anderer Daten als Teil einer Vereinigung auszuwählen.

    
F. P. Freely 20.04.2012 22:56
quelle
0

ANSI C spezifiziert minimale Wertebereiche für Typen. Sie können nur des ersten Falles sicher sein; nicht die zweite.

    
user82238 20.04.2012 22:55
quelle

Tags und Links