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?
Questo è semplicemente UB. Passando il tipo sbagliato a 'printf' si invoca UB. –
@R ..: Sì, l'ho capito, ma volevo assicurarmi che non mi mancasse qualcos'altro. – rainer