logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.
REKLAMA
  • #1 5640823
    mirekk36
    Poziom 42  
    Witam,

    Przeglądam sobie jakiś kod w necie dla ATmega32 napisany oczywiście w C, ale skoro tam są definicje zmiennych np tylko uint i z kodu wynika, że są one 16bitowe, to chyba wynika po pierwsze, że nie jest pisany w GCC prawda? (no ale to mało ważne)

    teraz moje pytanie - robione jest takie obliczenie na zmiennej uint

    zmienna = 2400 - 3600

    więc skoro uint to zmienna bez znaku, więc co da wynik tego działania powyżej???
  • REKLAMA
  • #2 5640831
    bobbyAIR
    Poziom 20  
    to samo co
    zmienna = (unsigned int)(-1200)
  • Pomocny post
    #3 5640940
    skynet_2
    Poziom 26  
    a mi się wydaje że
    uint16_t zmienna = 2400 - 3600
    do wynik 64336
  • REKLAMA
  • REKLAMA
  • #5 5641120
    mirekk36
    Poziom 42  
    eeeeh dla kogoś kto zna dobrze już C to fajna zabawa takie odpowiedzi, jak np zmienna = (unsigned int)(-1200)

    skynet_2 -> dzięki, a mógłbyś to jakoś sprawdzić?, żeby być pewnym tego wyniku? Nie mam pod ręką żadnej książki z podstawami i stąd moje pytanie
  • REKLAMA
  • #6 5641160
    skynet_2
    Poziom 26  
    przed napisaniem poprzedniego postu sprawdziłem na szybko w Dev-C++ ;)
        unsigned int short zmienna = 2400 - 3600;
        cout<<zmienna<<endl;// wypisuje 64336

    więc powinno być dobrze
  • #7 5641163
    Freddie Chopin
    Specjalista - Mikrokontrolery
    zamiast debatowac sprawdz to na symulatorze <;

    w rzeczywistosci liczba 64336 i -1200 odpowiadaja dokladnie temu samemu zapisowi binarnemu (wiec i hexadecymalnemu) w pamieci dla slowa 16bitowego: 0xFB50. wszystkie problemy biora sie wlasnie z tego, ze liczbom binarnym na sile chce sie przypisac wartosci dziesietne, a to wlasnie tak sie konczy.

    wspaniala zaleta systemu U2 jest to, ze dodawanie i odejmowania dla liczb ujemnych i dodatnich jest realizowane dokladnie tak samo, wiec to czy 0xFB50 znaczy akurat 64336 czy -1200 to tylko kwestia fantazji tego kto czyta kod. 2400-3600 da taki sam wynik jak 65536-1200.

    jesli kwestia ta cie zastanawia, to wystarczy wiedziec ze w systmie U2 operacje + i - po przekroczeniu naturalnych granic ([0;0xFFFF] dla unsigned i [0x8000;0x7FFF] dla signed) sie po prostu zawijaja w druga strone, dlatego tez 2400-3200 da 0xFFFF-(roznica) w zapisie bez znaku.

    tu nie ma zadnej wielkiej filozofii i NIE JEST to kwestia jezyka C. dokladnie tak samo bedzie w ASM, bascomie, brainfucku, whitespace i innych <:

    4\/3!!
  • #8 5641174
    szelus
    Poziom 34  
    Nadmiar w operacjach na zmiennych całkowitych nie jest nigdy wykrywany i faktycznie dodawanie i odejmowanie są tak samo wykonywane na liczbach ze znakiem i bez. Tak samo jak w asemblerze. Jest tylko kwestia, czy wynik jest interpretowany bez znaku, czy w kodzie uzupełnieniowym do dwóch.
  • #9 5649590
    Dr.Vee
    VIP Zasłużony dla elektroda
    mirekk36 napisał:
    Witam,

    Przeglądam sobie jakiś kod w necie dla ATmega32 napisany oczywiście w C, ale skoro tam są definicje zmiennych np tylko uint i z kodu wynika, że są one 16bitowe, to chyba wynika po pierwsze, że nie jest pisany w GCC prawda? (no ale to mało ważne)

    teraz moje pytanie - robione jest takie obliczenie na zmiennej uint

    zmienna = 2400 - 3600

    więc skoro uint to zmienna bez znaku, więc co da wynik tego działania powyżej???


    Pierwsza uwaga - polecam znaleźć sobie lepszy kod do przeglądania ;) Jak ktoś pisze coś takiego w kodzie, to szkoda wysiłku na dalszą lekturę.

    Co do uint, czy unsigned, czy u16 czy uint16_t, to nie ma znaczenia - nowe nazwy typów można definiować przez typedef:
    typedef unsigned int u16;
    Najlepiej używać nagłówka stdint.h, w którym są zadeklarowane m.in. typy [u]int{8,16,32,64}_t, odpowiednio dla architektury danego procesora.

    Koledzy już odpowiedzieli na pytanie o konwersję, ja tylko poprę cytatem ze standardu ISO C99:

    Cytat:
    6.3.1.3 Signed and unsigned integers

    When a value with integer type is converted to another integer type other than _Bool, if the value can be represented by the new type, it is unchanged.

    Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more than the maximum value that can be represented in the new type until the value is in the range of the new type. (49)

    Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised.

    Pozdrawiam,
    Dr.Vee
REKLAMA