Ich habe einen extrem bösen Käfer aufgespürt, der sich hinter diesem kleinen Juwel versteckt. Mir ist bekannt, dass gemäß der C ++ - Spezifikation signierte Überläufe ein undefiniertes Verhalten sind, jedoch nur dann, wenn der Überlauf auftritt, wenn der Wert auf Bitbreite erweitert wird sizeof(int). So wie ich es verstehe, sollte das Inkrementieren von a charniemals undefiniertes Verhalten sein, solange sizeof(char) < sizeof(int). Das erklärt aber nicht, wie cman einen unmöglichen Wert bekommt . Wie kann eine 8-Bit-Ganzzahl cWerte enthalten, die größer als ihre Bitbreite sind?
Code
// Compiled with gcc-4.7.2
#include <cstdio>
#include <stdint.h>
#include <climits>
int main()
{
int8_t c = 0;
printf("SCHAR_MIN: %i\n", SCHAR_MIN);
printf("SCHAR_MAX: %i\n", SCHAR_MAX);
for (int32_t i = 0; i <= 300; i++)
printf("c: %i\n", c--);
printf("c: %i\n", c);
return 0;
}
Ausgabe
SCHAR_MIN: -128
SCHAR_MAX: 127
c: 0
c: -1
c: -2
c: -3
...
c: -127
c: -128 // <= The next value should still be an 8-bit value.
c: -129 // <= What? That's more than 8 bits!
c: -130 // <= Uh...
c: -131
...
c: -297
c: -298 // <= Getting ridiculous now.
c: -299
c: -300
c: -45 // <= ..........
Probieren Sie es auf ideone aus.
printf()funktioniert Konvertierung?