2013-03-26 8 views
5

ich durch C++ Integer Overflow and Promotion suchen, versuchte es zu replizieren, und schließlich mit dieser endete:Integer Förderung, mit/ohne Vorzeichen, und 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; 
} 

Die cout tut, was ich erwartet hatte, nachdem die Post oben genannten Lesen, wie auch die zweite printf: beide 4294967291 drucken. Die erste printf druckt jedoch -5. Nun, meine Vermutung ist, dass dies printf einfach interpretiert den vorzeichenlosen Wert von 4294967291 als vorzeichenbehafteten Wert, am Ende mit -5 (was würde passen sehen, dass die Zweierkomplement von 4294967291 ist 11 ... 11011), aber ich bin nicht 100% überzeugt, dass ich nichts übersehen habe. Also, habe ich recht oder passiert hier noch etwas?

+1

Dies ist einfach UB. Übergeben Sie den falschen Typ an 'printf', wird UB aufgerufen. –

+0

@R ..: Ja, das habe ich mir gedacht, aber ich wollte sichergehen, dass ich nicht noch etwas anderes vermisse. – rainer

Antwort

4

Ja, Sie haben es richtig gemacht. Deshalb ist printf() generell unsicher: Es interpretiert seine Argumente streng nach der Formatzeichenfolge und ignoriert dabei ihren eigentlichen Typ.