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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 24 maja 2025, o 19:20


    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: 27405
    Lokalizacja: Szczecin
    Pomógł: 1043

    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 0 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