short

Der Typ short speichert einen ganzzahligen Wert, welcher heutzutags mit 2 Bytes codiert wird. Damit kann ein Wertebereich von -32'768 bis +32'767 abgedeckt werden. Für den vorzeichenlosen Typ können Werte von 0 bis +65'535 abgedeckt werden.

Siehe auch char, int, long long, signed, unsigned

Details

Ein short wird als eine 2-Byte-Ganzzahl, sprich mit 16 Bits codiert. Das Keyword short ist als Grössenangabe des Typs int zu betrachten. Die vollständige Bezeichnung des Typs lautet somit short int oder int short, allerdings wird normalerweise zur Vereinfachung und besseren Lesbarkeit auf das Keyword int verzichtet.

Ein short-Typ kann als Erweiterung entweder mit signed oder unsigned deklariert werden. Je nachdem speichert ein short entweder sowohl negative als auch positive Werte, oder aber explizit nur positive. Wird die Erweiterung weggelassen, wird vom Compiler standardmässig signed angenommen. Ob die Erweiterung vor oder nach dem Typ steht, spielt keine Rolle. Bei Verwendung der vollständigen Bezeichnung kann die Erweiterung auch zwischen den Keywords short und int stehen.

short               a;
signed short        b;
short signed        c;
unsigned short      d;
short unsigned      e;
int signed short    f;
unsigned short int  g;

Positive Werte werden als Integer-Representation gespeichert. Der Wert 0x0000 entspricht der Zahl 0 (Null), der Wert 0x0001 der Zahl 1 (Eins) und so weiter und so fort. Bei einem unsigned short entspricht 0xffff dem maximal möglichen Wert. Die negativen Werte eines signed short werden mittels des Zweierkomplements codiert. Der Wert 0x8000 entspricht dann der Zahl -32768 und der Wert 0xffff der Zahl -1.

Die maximal und minimal möglichen Werte eines short sind in der limits-Bibliothek definiert:





-32768
32767
65535
#include <stdio.h>
#include <limits.h>

int main(){
  printf("%hd\n", SHRT_MIN);
  printf("%hd\n", SHRT_MAX);
  printf("%hu\n", USHRT_MAX);
  return 0;
}

Der minimale Wert eines unsigned short ist 0. Bei einem Under- oder Overflow springt der Wert bei einem unsigned short von 0 auf +65535 und bei einem signed short von -32768 auf +32767 beziehungsweise umgekehrt. Dies wird als Wrap-Around bezeichnet.

Arithmetische Umwandlung

Bei Zuweisungen, Initialisierungen oder Casts zu einem short-Typ werden durch den Compiler gegebenfalls arithmetische Umwandlungen durchgeführt. Im folgenden sind die Umwandlungsregeln für den short-Typ beschrieben. Bei unsicheren Umwandlungen gibt ein Compiler üblicherweise eine Warnung aus, welche jedoch bei Bedarf mittels eines expliziten Casts unterdrückt werden kann.

Bei der Umwandlung eines Fliesskomma-Typs in einen short werden die Nachkommastellen schlicht abgeschnitten (Rundung hin zu Null).

123
-123
  printf("%hd\n", (signed short) 123.456);
  printf("%hd\n", (signed short)-123.456);

Hat die umzuwandelnde Fliesskommazahl keinen Platz in einem short, so wird der maximal, beziehungsweise der minimal mögliche Wert angenommen.

32767
-32768
65535
0
  printf("%hd\n", (signed   short) 1e20);
  printf("%hd\n", (signed   short)-1e20);
  printf("%hu\n", (unsigned short) 1e20);
  printf("%hu\n", (unsigned short)-1e20);

Bei der Umwandlung eines Integer-Typs in einen short bleiben in den wichtigsten Fällen der Wert sowie das Vorzeichen exakt erhalten:





123
-123
123
-123
  unsigned  char  c1 =  123;
  signed    char  c2 = -123;
  unsigned  int   i1 =  123;
  signed    int   i2 = -123;
  printf("%hu\n", (unsigned short) c1);
  printf("%hd\n", (signed   short) c2);
  printf("%hu\n", (unsigned short) i1);
  printf("%hd\n", (signed   short) i2);

Die Regeln für die Umwandlung eines Integer-Wertes in einen short lauten: Die niederwertigsten 16 Bits des zuzuweisenden Wertes werden bitgenau kopiert. Falls der zuzuweisende Wert weniger wie 16 Bitstellen aufweist (insbesondere bei char), werden die verfügbaren Bitstellen an die niederwertigsten Bitstellen des short kopiert. Die nicht-definierten höherwertigen Bit-Stellen werden folgendermassen aufgefüllt: Wenn der Typ des zuzuweisenden Wertes vorzeichenlos ist, wird an alle nicht-definierten Bit-Stellen das Bit 0 kopiert. Wenn der Typ des zuzuweisenden Wertes vorzeichenbehaftet ist, wird das höchstwertige Bit der verfügbaren Bitstellen an sämtliche höherwertige Bit-Stellen kopiert.

Durch diese Regeln können folgende Fälle zu falschen Werten führen: Eine vorzeichenbehaftete Zahl kann nicht korrekt in einen vorzeichenlosen Typ umgewandelt werden. Eine zu grosse vorzeichenlose Zahl kann bei der Umwandlung in einen vorzeichenbehafteten Typ zu negativen Werten führen. Bei der Umwandlung von (vorzeichenbehafteten oder vorzeichenlosen) Zahlen höherer Mächtigkeit (insbesondere bei int und long long) kann durch die Kürzung auf 16 Bit der Wert verfälscht werden oder gar zu falschem Vorzeichen führen.

65413
-5536
14464
-31072
  printf("%hu\n", (unsigned short) -123);
  printf("%hd\n", (signed   short)  60000);
  printf("%hd\n", (signed   short)  80000);
  printf("%hd\n", (signed   short)  100000);

Ein Javascript-Programm zur Veranschaulichung der Effekte beim Abschneiden von Bits ist beim Zahlensystem-Umrechner zu finden.