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

Atmega32A - Błąd przy konwersji int16_t do uint16_t dla wartości powyżej 16384

xujemuje 16 Maj 2016 00:12 1200 5
  • #1 15676685
    xujemuje
    Poziom 9  
    Witajcie,
    mam problem przy konwersji liczby 16-bitowej ze znakiem do liczby 16-bitowej bez znaku.

    int16_t xx;
    uint16_t yy;

    yy = (uint16_t) ((((-1)*(xx))<<1)-1);

    Kiedy wartość xx przekracza mi 16384, wartość yy przybiera wartości ujemne od -32768 rosnąc do zera. Co robię źle?
  • #2 15676703
    Konto nie istnieje
    Konto nie istnieje  
  • #3 15676712
    xujemuje
    Poziom 9  
    akurat ten wariant jest dla liczb <0 do wartości -32767. Chcę z tego zakresu uzyskać odpowiadające wartości dodatnie z zakresu 0 ... 65535. Mnożę zatem ten pierwszy zakres przez -1, potem mnożę przez dwa przesuwając bitowo w lewo o jedną pozycję i odejmuję 1, żeby uzyskać przy minimalnej wartości z pierwszego zakresu maksymalną liczbę z drugiego.
    Ale problem jest taki, jaki opisałem w poście pierwszym. Przez kompilator cmaniaka przechodzi prawidłowo, tak jak oczekuję.
  • #4 15676728
    Konto nie istnieje
    Konto nie istnieje  
  • #5 15676738
    xujemuje
    Poziom 9  
    Dla wartości xx>0 miałem taką procedurę, zagalopowałem się z myślami

    yy = (uint16_t) ((xx<<1)+1)
  • #6 15676744
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA