2013-06-12 37 views
6

Kiedy wykonanie tego kodu zwraca mi 1610612736Jak pomnożyć liczbę całkowitą w C?

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

Dlaczego i jak to naprawić?

edycja: nie jest jeszcze sprawą całkowitej i pływak, jeśli wymienić Int b = 2: przez pływak b = 2.0f zwróci sam wynik głupie

+0

Jest to kwestia liczby całkowitej i zmiennoprzecinkowej - zobacz moją odpowiedź. –

+0

@Carl ma rację. Nie może to być problem typu "float/int" z samym mnożeniem, ale _definitely_ jest w ciągu formatującym. – paxdiablo

+0

Funkcja 'printf' jest metodą * varargs *, z podpisem' int printf (format const char *, ...) '. Oznacza to, że przyjmuje on arbitralne argumenty po pierwszym i nie może ich sprawdzić w czasie kompilacji lub * rzutuje je na żądany typ wzięty z ciągu formatu *. Twój ciąg formatu mówi '% d', który szuka' int'. Wyrażenie "a * b" to 'float', które zostaje przekształcone w' double'. Te typy nie mają nawet tego samego rozmiaru pamięci, więc tymczasowe "podwójne" zostaje fizycznie przecięte na pół i traktowane jako "int". To nie jest rozwiązanie salomoneka. –

Odpowiedz

11

na wynik mnożenia float i AN int to float. Poza tym zostanie on awansowany na double po przejściu na printf. Potrzebujesz formatu %a, %e,. Format %d służy do drukowania typów int.

Uwaga od autora: Wartość zwracana main powinna wynosić int. Oto stałe Program:

#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; 
} 

a jego produkcja:

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

Wow, '% a' musi być w działaniu dla" najbardziej bezużyteczny specyfikator formatu w roli printf "Nagroda :-) – paxdiablo

+8

To świetnie! Możesz przesyłać (binarnie) liczby zmiennoprzecinkowe 100% dokładnie za pomocą łańcuchów, używając go, nawet do systemów, które nie używają IEEE754. Zachowuje wszystkie elementy precyzji w całkowicie jednoznaczny sposób. Użytkownicy prawdopodobnie nie dbają o to, chociaż ... –

+0

niesamowite, że działa dzięki! – Wicelo

2

Alternatywnie, można również zrobić

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

a to wydrukować wynik masz (niby) spodziewa .

Powinieneś zawsze jawnie dobierać zmienne tak, aby pasowały do ​​ciągu formatu, w przeciwnym razie zobaczysz wydrukowane niektóre dziwne wartości.

Powiązane problemy