2013-06-12 12 views
6

Quando eseguo questo codice mi 1610612736Come moltiplicare il float con gli interi in C?

void main(){ 
float a=3.3f; 
int b=2; 
printf("%d",a*b); 
} 

Perché e come risolvere questo problema si restituisce?

modifica: Non è nemmeno una questione di integer e float, se i sostituire int b = 2: dal galleggiante b = 2.0f esso restituisce lo stesso risultato stupido

+0

È una questione di numero intero e fluttuante - vedere la mia risposta. –

+0

@Carl ha ragione. Potrebbe non essere un problema float/int con la moltiplicazione stessa, ma _definitamente_ è nella stringa di formato. – paxdiablo

+0

La funzione 'printf' è un metodo * varargs *, con firma' int printf (const char * format, ...) '. Ciò significa che accetta argomenti arbitrari dopo il primo, e non può controllarli in fase di compilazione o * trasmetterli a un tipo desiderato preso dalla stringa di formato *. La stringa di formato dice '% d', che cerca un' int'. L'espressione 'a * b' è' float', che viene convertita in 'double'. Questi tipi non hanno nemmeno la stessa dimensione di memoria, quindi il 'doppio' temporaneo viene fisicamente tagliato a metà e trattato come un' int'. Questa non è una soluzione di Salomone. –

risposta

11

Il risultato della moltiplicazione di un float ed un int è un float. Oltre a questo, verrà promosso a double passando a printf. È necessario un formato %a, %e, %f o %g. Il formato %d viene utilizzato per stampare i tipi int.

Nota editoriale: il valore restituito di main deve essere int. Ecco un programma fisso:

#include <stdio.h> 

int main(void) 
{ 
    float a = 3.3f; 
    int b = 2; 
    printf("%a\n", a * b); 
    printf("%e\n", a * b); 
    printf("%f\n", a * b); 
    printf("%g\n", a * b); 
    return 0; 
} 

e la sua uscita:

$ ./example 
0x1.a66666p+2 
6.600000e+00 
6.600000 
6.6 
+2

Wow, '% a' deve essere in esecuzione per il" più " "Un identificatore di formato inutile in un ruolo di printf" :-) – paxdiablo

+8

È fantastico! È possibile trasferire numeri (in virgola mobile) in virgola mobile al 100% con precisione utilizzando stringhe, anche con sistemi che non utilizzano IEEE754. Conserva tutti i bit di precisione in un modo completamente non ambiguo. Gli utenti probabilmente non si preoccupano di vederlo, però .... –

+0

fantastico che funziona grazie! – Wicelo

2

In alternativa, si potrebbe anche fare

printf("%d\n", (int)(a*b)); 

e questo sarebbe stampare il risultato che stai (tipo di) in attesa .

È sempre consigliabile digitare le variabili in modo che corrispondano alla stringa di formato, altrimenti è possibile visualizzare alcuni valori strani stampati.

Problemi correlati