Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 25 sty 2025, o 23:11


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 5 cze 2014, o 13:32 
Offline
Użytkownik

Dołączył(a): 12 mar 2014
Posty: 266
Lokalizacja: Warszawa
Zbananowany użytkownik

Pomógł: 2

Witam

Piszę pewną funkcję w której mnożone są duże liczby. Liczby te oczywiście nie przekraczają możliwości deklarowanych typów zmiennych. Jednak wyniki działań są błędne.

Przykładowo 367 * 2014 = 18242

Dlaczego tak się dzieje i czy da się jakoś obejść ten problem?

_________________
Wysłane z Nokii 3310



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2014, o 13:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Niejawne rzutowanie.

http://atnel.pl/domyslna-promocja-do-typu-int.html


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2014, o 13:39 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

A do zmiennej jakiego typu przypisujesz wynik tego działania?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2014, o 13:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Czynniki zapewne są 16 bitowe. A zmienna w której ma lądowac iloczyn jest 32 bitowa.
Ale i tak kompilator dokona niejawnego rzutowania to najszerszego typu który występuje w wyrażeniu czyli jak sądze 16 bit i to int czyli ze znakiem. Mimo, że zmienna do której jest przypisywany wynik iloczynu jest 32 bit. To jest typowa optymalizacja ze strony kompilatora.
Dlatego albo jeden z czynników trzeba zrobić 32 bit albo całe wyrażenie jawnie rzutować do takiego typu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2014, o 13:52 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

Cytuj:
Czynniki zapewne są 16 bitowe. A zmienna w której ma lądowac iloczyn jest 32 bitowa.
Ale i tak kompilator dokona niejawnego rzutowania to najszerszego typu który występuje w wyrażeniu czyli jak sądze 16 bit i to int czyli ze znakiem. Mimo, że zmienna do której jest przypisywany wynik iloczynu jest 32 bit. To jest typowa optymalizacja ze strony kompilatora.
Dlatego albo jeden z czynników trzeba zrobić 32 bit albo całe wyrażenie jawnie rzutować do takiego typu.



Czyli nawet jakbym miał coś takiego:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


to zmienna liczba32_bit będzie i tak miała wartość z zakresu dla liczby 16 bitowej?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2014, o 14:07 
Offline
Użytkownik

Dołączył(a): 12 mar 2014
Posty: 266
Lokalizacja: Warszawa
Zbananowany użytkownik

Pomógł: 2

Dzięki. Niejawne rzutowanie rozwiązało problem.

_________________
Wysłane z Nokii 3310



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2014, o 14:08 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27351
Lokalizacja: Szczecin
Pomógł: 1042

Nefarious19 napisał(a):
to zmienna liczba32_bit będzie i tak miała wartość z zakresu dla liczby 16 bitowej?


poczytaj ten link wyżej, który podał kolega sq8dsr ;) .... poczytaj żebyś się nie zdziwił w przyszłości

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2014, o 14:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Nefarious19 napisał(a):
to zmienna liczba32_bit będzie i tak miała wartość z zakresu dla liczby 16 bitowej?

Tak bo kompilator dokona niejawnego rzutowania na typ int.

To będzie wyglądało tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


wystarczy jednak zrobić jawnie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2014, o 23:24 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

Kurcze, nie pomyślałbym że takie cos może mieć miejsce:) dziękuje Panowie za zwrócenie uwagi:)



mirekk36 napisał(a):
poczytaj ten link wyżej, który podał kolega sq8dsr ;) .... poczytaj żebyś się nie zdziwił w przyszłości


Teraz na pewno się nie zdziwię :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO