Bei Angabe der Konstanten in Hex-Form fällt mir hier jetzt auf Anhieb
auch kein problematischer Punkt ein.
Eine subtile Falle kann allerdings bei bestimmten dezimalen Konstanten
lauern (Beispiel auf x86, also mit 32 Bit long):
1 | #include <stdio.h>
|
2 |
|
3 | long long i = -2147483648;
|
4 |
|
5 | int main(void)
|
6 | {
|
7 | printf("%lld\n", i);
|
8 | return 0;
|
9 | }
|
1 | % gcc -std=iso9899:1990 -g -O2 -W -Wall -o large large.c
|
2 | large.c:3: warning: this decimal constant is unsigned only in ISO C90
|
3 | % ./large
|
4 | 2147483648
|
5 | % gcc -std=iso9899:1999 -g -O2 -W -Wall -o large large.c
|
6 | % ./large
|
7 | -2147483648
|
"long long" ist hier natürlich im C90-Fall eine GCC-Erweiterung,
nichtsdestotrotz ist das Ergebnis "überraschend".
Der Hintergrund ist, dass es in ANSI-C eigentlich keine negativen
Konstanten gibt. "-2147483648" ist die Konstante "2147483648", auf die
dann eine Negation angewendet wird. In C90 ist "2147483648" nicht mehr
in einem long darstellbar (soweit long 32 Bits hat), daher ist das dann
ein unsigned long, und auch die Negation wird dann mit unsigned long
gerechnet (so unsinnig das auch erstmal klingen mag), das Ergebnis
bleibt positiv. In C99 wird dagegen auf long long (minimal 64 Bits)
statt unsigned long zurückgegriffen, daher führt dann die Negation auch
wirklich zu einem negativen Wert.
Andreas