Szukałem przez C++ Integer Overflow and Promotion, próbował go powielać, a ostatecznie zakończył się z tym:Integer promocja, podpisany/unsigned i printf
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
int i = -15;
unsigned int j = 10;
cout << i+j << endl; // 4294967291
printf("%d\n", i+j); // -5 (!)
printf("%u\n", i+j); // 4294967291
return 0;
}
cout
ma czego się spodziewałem po przeczytaniu posta wspomniano powyżej, podobnie jak drugi printf
: oba drukują 4294967291. Pierwszy printf
drukuje jednak -5. Teraz domyślam się, że to jest printf
po prostu interpretuję niepodpisaną wartość 4294967291 jako podpisaną wartość, kończącą się na -5 (co pasowałoby widząc, że uzupełnienie 2 do 4294967291 to 11 ... 11011), ale nie jestem W 100% przekonany, że niczego nie przeoczyłem. Czy mam rację, czy coś tu się dzieje?
To jest po prostu UB. Przekazywanie niewłaściwego typu do 'printf' wywołuje UB. –
@R ..: Tak, pomyślałem, ale chciałem się upewnić, że nie przegapiłem czegoś innego. – rainer