2013-03-26 13 views
5

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?

+1

To jest po prostu UB. Przekazywanie niewłaściwego typu do 'printf' wywołuje UB. –

+0

@R ..: Tak, pomyślałem, ale chciałem się upewnić, że nie przegapiłem czegoś innego. – rainer

Odpowiedz

4

Tak, masz rację. Dlatego printf() jest generalnie niebezpieczne: interpretuje swoje argumenty ściśle według ciągu formatów, ignorując ich rzeczywisty typ.