Konwersja niejawna - przypisanie wyrażenia do zmiennej a wyświetlenie bezpośrednio przez printf()

0

Witam!

Jestem początkującym programistą, więc żeby zrozumieć lepiej kiedy i w jaki sposób zachodzi konwersja, zacząłem mieszać typy danych i obserwować wyniki. Przypisanie wyrażenia do zmiennej dawało przewidywalne rezultaty, natomiast gdy wyrażenie umieściłem bezpośrednio w funkcji printf - wynik mnie zdziwił. Przykład:

printf("\n %d",5.0); wyświetla 0 - dlaczego nie 5?
printf("\n %d",5.1); wyswietla 1717986918 (???) - spodziewałem się raczej obcięcia do 5
printf("\n %d",5.1f); wyswietla 1610612736
printf("\n %d",5*5.1); wyswietla 0 - czemu nie 25?
printf("\n %d",5/2); wyswietla 2 - rozumiem
printf("\n %d",5/2.0); wyswietla 0 - myslalem ze 5 konwertuje sie na float, a potem caly wynik z float na int i wyjdzie 2
printf("\n %d",(float)2/5); wyswietla -1610612736

Skąd te konkretne wyniki?

Wiem, że niektóre z moich wymysłów są bezsensowne i bezcelowe, ale już kilka razy przy obliczeniach pojawiały się dziwne wyniki np. duże liczby ujemne, więc możliwe, że przyczyną były tego typu konwersje... Bardzo zależy mi na Waszej pomocy.

0

bo przez %d dajesz znać, że chcesz wydrukować liczbę całkowitą.
http://pl.wikibooks.org/wiki/C/printf#Argumenty
W sekcji FOrmat masz opisane co i jak.

edit: czekaj, troche pozna godzina i nie załapałem od razu o co pytasz :)

Edit2: z tego co wiem, printf nie dokona Ci konwersji bezpośrednio przy wypisywaniu.
5/2 jest interpretowane jako int / int, co daje wynik rowniez w int, wiec nie ma problemu, ale 5.1 nie będzie tak po prostu przy operatorze konwersji %d rozumiane jako zaokrąglone 5. Jest prawie 4:00 a poza tym w C bawilem sie krotko, bo tylko pol roku na studiach i to tak podstawowe rzeczy ze masakra, wiec moge sie mylic :)

0

Typy przekazywanych danych:
1.double; 2. double;3.float; 4. double; 5. int; 6. double; 7.float.
Tylko w jednym przypadku (5) masz typ zgodny z intrepretacją podaną w łańcuchy formatującym. Ta funkcja nie przeprowadza konwersji! Interpretuje obszar pamięci zajęty przez dane tak jak zostało podane w formatowaniu.

0

Poogladaj sobie: http://www.uw-team.org/videoarty_assembler.html
jak zrozumiesz jak dziala stos I jak wywolywana jest funkcja printf to wszystko powinno sie rozjasnic

0

musisz zrozumiec jak dane trzymane sa w pamieci liczby zmiennoprzecinkowe (http://stackoverflow.com/questions/6910115/how-to-represent-float-number-in-memory-in-c)i jak dziala funkcja o zmiennej ilosci argumentow. w pierwszym argumencie printf podajesz jakiego typu sa dane sa pozostale argumenty i ile ich jest. dla %d program traktuje nastepne n bajtow (w zaleznosci od architektury, najczesciej 2 lub 4) doslownie jak int - nie zwraca uwage na mantyse.

0

Dziękuję wszystkim, już zabieram się do przeglądania linków :) Dobrze, że są jeszcze miejsca, gdzie można otrzymać konkretną pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1