2013-03-26 47 views
5

stavo guardando attraverso C++ Integer Overflow and Promotion, ha cercato di replicare, e, infine, si è conclusa con questo:promozione Integer, firmato/unsigned, e 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; 
} 

Il cout fa quello che mi aspettavo dopo aver letto il post di cui sopra, così come il secondo printf: entrambi stampano 4294967291. Il primo printf, tuttavia, stampa -5. Ora, suppongo che questo sia printf semplicemente interpretando il valore senza segno di 4294967291 come valore con segno, finendo con -5 (che si adatterebbe vedendo che il complemento a 2 di 4294967291 è 11 ... 11011), ma non lo sono 100% convinto che non ho trascurato nulla. Quindi, ho ragione o sta succedendo qualcos'altro qui?

+1

Questo è semplicemente UB. Passando il tipo sbagliato a 'printf' si invoca UB. –

+0

@R ..: Sì, l'ho capito, ma volevo assicurarmi che non mi mancasse qualcos'altro. – rainer

risposta

4

Sì, avete capito bene. Ecco perché printf() non è generalmente sicuro: interpreta i suoi argomenti rigorosamente in base alla stringa di formato, ignorando il loro tipo effettivo.