Przesuniecie bitowe liczby ujemnej

0

Witam,
mam pytanie, jak działa przesunięcie bitowe liczby ujemnej w C ? Z tego co wiem to w C liczby ujemne zapisane są w kodzie U2, zrobiłem prosty program:

 i
int16_t a;
a=0xF0F5;
int16_t b=(a>>4);
sprintf(temptab,"%d  %d",a,b);
LCD_GoTo(0,1);
LCD_WriteText(temptab);

jest to wyświetlanie na LCD ( przy pomocy atmegi, ale to nie ważne ). liczba pierwsza:
-3851
-241

i pytanie o druga liczbę, jak przesunę o 4 bity w prawo i pojawi się 0 na pierwszej pozycji powinna być liczba dodatnia, tak ( czy w C nie jest używanie U2 ? )? Może ktoś to wytłumaczyć ? : D Dzięki za pomoc

0

Po przesunięciu 0xF0F5 wyjdzie 0xFF0F dla liczb ujemnych na pierwszych pozycjach pojawiają się jedynki .

0

Tutaj masz opis przesunięć w C/C++: Po co są Strumienie do zmiennych?

To co robisz jest implementation defined ale w praktyce będzie to przesunięcie arytmetyczne, czyli bit znaku zostanie zachowany. To oznacza, że nigdy nie zobaczysz w takiej sytuacji zmiany z liczby ujemnej na dodatnią. Szczegóły w linku wyżej.

Kod U2 ogólnie nie jest gwarantowany, natomiast akurat int16_t musi być w kodzie U2.

0

Znalazłem coś takiego:
http://marie-www.ee.pw.edu.pl/~cackoa/courses/jimp/jimp10.php
i tutaj pojawi się kolejne pytanie, patrząc na to :

a = 10010010
a << 1 == 00100100 // w lewo 1 pozycję dla logicznego i arytmetycznego
a << 2 == 01001000 // w lewo 2 pozycje dla logicznego i arytmetycznego

a >> 1 == 01001001 // w prawo dla logicznego
a >> 2 == 00100100 // w prawo dla logicznego

a >> 1 == 11001001 // w prawo dla arytmetycznego
a >> 2 == 11100100 // w prawo dla arytmetycznego

skąd wiedzieć w jakim kompilatorze jak zadziała ?

0

Dziękuję teraz rozumiem, pisałem odpowiedź i nie zauważyłem Waszych odpowiedzi : )

1 użytkowników online, w tym zalogowanych: 0, gości: 1