Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C][ATMEGA8] - Ustawienie 16 bitu liczby 32 bitowej

mac 13 Mar 2013 09:59 1092 2
  • #1 13 Mar 2013 09:59
    mac
    Poziom 15  

    Witam

    Mam problem z ustawieniem bitów powyżej 16 w 32 bitowej liczbie. Kod ustawiający:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Ustawianie działa poprawnie do 15 bitu. Przy 16 kroku zamiast uzyskać wynik
    vport=0x0000FFFF uzyskuje vport=0xFFFFFFFF

    Mógłby ktoś wyjaśnić dlaczego i jak to naprawić.

    0 2
  • Pomocny post
    #2 13 Mar 2013 10:33
    2P
    Poziom 19  

    Domyślnie preprocesor używa liczb typu int dla stałych wyliczeniowych. Dla procesora 8 bit, liczba int ma 16 bitów. Ustawienie najstarszego bitu jest traktowane jako liczba ujemna. Następuje niejawne rzutowanie zakresu, a rozszerzanie zakresu liczby ujemnej odbywa się przez kopiowanie najstarszego bitu.

    Poniższy zapis powinien być prawidłowy:

    Code:
    vport |= 1UL << krok


    Przez przyrostek UL zmuszamy procesor aby traktował stałą jako typ unsigned long.

    ---------------------------------------------------
    Dodano:
    Błąd merytoryczny w mojej wypowiedzi:
    Preprocesor pracuje na danych wyłącznie tekstowych.
    To kompilator "rozumie" i odpowiednio traktuje stałe.
    Przez przyrostek UL zmuszamy kompilator aby traktował stałą jako określony typ.

    Tak dla porządku i wartości dydaktycznych.

    0
  • #3 13 Mar 2013 10:52
    mac
    Poziom 15  

    Dzięki 2P. Działa.

    Podejrzewałem, że chodzi o rzutowanie zmiennych, ale próbowałem sposobem kolegi BlueDraco i niestety.

    0