Come altri hanno già detto, il superamento di un int
per printf
quando è in attesa di un double
cause comportamento indefinito, e tutto può succedere. Potresti essere interessato al motivo perché il programma stampa il 98.979980
sulla terza riga e non un numero casuale.
Gli argomenti vengono passati a printf
nello stack. Quando la riga 2 passa 98.98
a printf
, viene inserito in pila, con la parte meno significativa del numero precedente.
Quindi torna printf
e nella terza riga viene richiamato, ora con 98
inserito nello stack. Sulla tua architettura il tipo int
sembra essere a 32 bit; metà delle dimensioni del tipo double
, quindi questo sovrascrive solo la metà inferiore di 98.98
che era in pila in precedenza. La metà superiore di 98,98 è ancora in pila.
Ora la terza chiamata a printf
legge uno double
dallo stack. La metà più significativa di ciò che legge proviene dallo 98.98
che era in pila in precedenza e la metà meno significativa viene dalla rappresentazione binaria di 98
; questo è il motivo per cui il risultato è così vicino allo 98.98
. Poiché 98 è un numero così piccolo, i suoi bit più significativi saranno 0 e impostando la metà meno significativa di 98.98
su zeri per lo più, si ottiene un numero inferiore.
Se la riga 3 utilizza un numero con più bit impostati su 1, si ottiene un risultato superiore a 98.98
. Ad esempio, la rappresentazione binaria di -1 ha tutti i bit a 1, e si ottiene:
printf("line 2: %f\n", 98.98); # 98.98
printf("line 3: %f\n", -1); # 98.980042
Se il compilatore usato 64 int bit o passati double
s con la parte più significativa prima, o utilizzata una registrarsi al posto dello stack per passare i parametri, otterresti risultati molto diversi.
http://codepad.org/P6wolXsM –
@hbrock, il compilatore non ha importanza. Il codice OP causa un comportamento indefinito. Questa domanda è un duplicato centinaia di volte. –
perché un int è passato a printf quando si aspetta float, ecco perchè ha funzionato in modo strano. Ma il mio punto è il motivo per cui nell'ultima stampa, invece di stampare qualche valore di spazzatura o 0, sta usando il valore della seconda istruzione printf e questo è ciò che viene stampato. –