unsigned Modifikator

Jeder Integer-Typ kann mittels des Modifikators unsigned explizit als vorzeichenloser Typ deklariert werden.

Im Gegensatz dazu wird mittels des signed Modifikators ein Integer-Typ als vorzeichenbehaftet deklariert.

Details

Integer-Typen werden in modernen Systemen als binäre Ganzzahlen codiert. Wenn zu einer Typangabe wie char, short, int, long oder long long das Keyword unsigned angegeben wird, wird der Integer-Typ explizit als vorzeichenlos deklariert. Dies bedeutet, dass der Typ ausschliesslich positive Werte speichert (inklusive Null). Vorsicht: Wird das Keyword weggelassen, wird vom Compiler mit Ausnahme des char-Typs standardmässig signed angenommen. Ob das Keyword vor, nach oder in der Mitte des Typs steht, spielt keine Rolle.

unsigned int        a;
int unsigned        b;
char unsigned       c;
unsigned short      d;
long unsigned long  e;
unsigned            f;

Wird der Basis-Typ bei der Deklaration weggelassen, nimmt der Compiler automatisch den unsigned int-Typ an.

Vorzeichenlose Integer-Typen werden gerne gebraucht, um Grössen zu speichern, welche explizit nur positive Werte enthalten können. Es ist jedoch zu beachten, dass Berechnungen mit diesen Grössen ebenfalls nur vorzeichenlose Ergebnisse liefern. Ein häufig gesehener Fehler ist das Rückwärts-Zählen in einer for-Schleife:

4
3
2
1
0
4294967295
4294967294
4294967293
...
#include <stdio.h>

int main(){
  unsigned int i;
  for(i = 4; i>=0; i--){  // Will never terminate
    printf("%u\n", i);
  }
  return 0;
}

Die maximal und minimal möglichen Werte von unsigned-Typen sind in der limits-Bibliothek definiert.

Bei der Angabe von festen Werten im Quellcode können Integer-Werten das Suffix u angehängt werden, um sie explizit als unsigned zu kennzeichnen.

Arithmetische Umwandlung

Bei Zuweisungen, Initialisierungen oder Casts zu einem anderen Integer-Typ werden durch den Compiler gegebenfalls arithmetische Umwandlungen durchgeführt. Aufgrund der Codierung von negativen Zahlen können zu grosse vorzeichenlose Zahlen nicht korrekt in einen vorzeichenbehafteten Typ umgewandelt werden, was dann zu negativen Werten führt:

-294967296
printf("%d\n", (signed int) 4000000000u);

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