logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Rzutowanie jak rozwiązać - funkcja

xamrex 20 Lip 2011 18:08 1239 3
REKLAMA
  • #1 9739206
    xamrex
    Poziom 28  
    Witam,
    Mam mam taką funkcję:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I teraz gdy w main{} wpiszemu sobie
    SendSpi(34816);
    to wszystko działa cacy(nie ma żadnego warninga)
    natomiast gdy wpiszemy:
    SendSpi(17*2048);
    to otrzymujemy warnigna:
    ../main.c:11: warning: integer overflow in expression

    Można to rozwiązać w taki sposób:
    SendSpi(17*(uint32_t)2048);

    Ale ja chcę używać przesunięć bitowych.
    Więc jeśli napiszemy sobie tak:
    SendSpi(17<<10);
    to jeszcze działa.
    Ale już takie coś:
    SendSpi(17<<11);
    Nie działa.


    Próbowałem zrobić coś takiego:
    SendSpi(17<<(uint32_t)11);
    Ale oczywiście bez rezultatu, bo rzutuje mi liczbę 11, zamiast całego wyrażenia <<11.

    Jak to zapisać poprawnie?
  • REKLAMA
  • Pomocny post
    #2 9739343
    michalko12
    Specjalista - Mikrokontrolery
    SendSpi(17UL << 11);
  • REKLAMA
  • Pomocny post
    #3 9739397
    BoskiDialer
    Poziom 34  
    Na AVR'ach typ int ma 2 bajty, a wszystkie literały liczbowe domyślnie są typu int. 34816 pewnie normalnie powinno by powodować warning, gdyż komu chciało by się pisać 34816U żeby zaznaczyć, że literał ten ma być int'em bez znaku? Ten warning mogli jawnie wyrzucić, jednak w przypadku operacji 17*2048, jeśli obie liczby traktować jako int ze znakiem, operacja mnożenia powoduje przepełnienie (liczba staje się ujemna). Musisz brać pod uwagę tą osobliwość, gdyż jeśli zaczniesz przesuwać w lewo literał liczbowy, który jest typu int (więc w tym przypadku zajmuje dwa bajty), uzyskany wynik dalej będzie typu int. Konsekwencje: utracisz górną część wyniku (jako konsekwencja uzyskania wyniku na dwóch bajtach, po którym dopiero następuje rozszerzenie do 4 bajtów).

    Zasadniczo wynik przesuwania ma ten sam typ (a zarazem rozmiar) co wartość przesuwana (nie wartość przesunięcia), stąd poprawnym zapisem będzie to, co napisał michalko12
  • #4 9739463
    xamrex
    Poziom 28  
    Dzięki :)
    Działa :D
REKLAMA