?
In einer Ellipse (wie auch in Funktionen ohne Parameterliste) werden die integer promotions auf alle Parameter angewendet, und floats werden zu doubles erweitert. Der Standard nennt das "default argument promotions."
Konkret bedeutet das: Wenn du einen Integertyp benutzt, der kürzer ist als int (genauer: dessen conversion rank geringer ist als der von int und unsigned int) und dessen gesamter Wertebereich durch int dargestellt werden kann, wird dieser zu int umgewandelt. Ist er kürzer als int und kann sein Wertebereich von int nicht komplett dargestellt werden, so wird er zu unsigned int umgewandelt.
Beispiel:
unsigned short s = 123;
char c = 'A';
printf("%d\n", s); /* s wird hier befördert zu int. */
printf("%d\n", c); /* c wird hier befördert zu int. */
Interessanterweise ergibt sich daraus, dass
unsigned short s = 123;
printf("%u\n", s); /* s wird hier (plattformabhängig) befördert zu int, nicht unsigned int! */
streng genommen einen unspezifizierten Wert ausgibt. In gleicher Weise ist die Ausgabe von
unsigned u = ~0u; // (unsigned) -1
printf("%d\n", u);
eigentlich unspezifiziert, obwohl ~0u == (unsigned) -1 (== UINT_MAX) garantiert ist. Hintergrund ist
int i = -1;
unsigned u = (unsigned) -1;
if(0 == memcmp(&i, &u, sizeof(int))) {
puts("Zweierkomplementdarstellung wird benutzt.");
} else {
/* Dies ist vom Standard erlaubt, passiert aber auf heute gängigen Maschinen nicht.
* Eine alte UNIVAC wäre hier tatsächlich vorbeigekommen. Aber das war vor unser aller Zeit.
*/
puts("Zweierkomplementdarstellung wird nicht benutzt.");
}