Przesuniecie bitowe liczby ujemnej

Odpowiedz Nowy wątek
Wybitny Samiec
2015-12-30 23:00
Wybitny Samiec
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

Pozostało 580 znaków

2015-12-30 23:18

Rejestracja: 14 lat temu

Ostatnio: 1 minuta temu

0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-12-30 23:20

Rejestracja: 17 lat temu

Ostatnio: 2 miesiące temu

Lokalizacja: Katowice

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.


"(...) otherwise, the behavior is undefined".
edytowany 2x, ostatnio: Endrju, 2015-12-30 23:29

Pozostało 580 znaków

Wybitny Samiec
2015-12-30 23:24
Wybitny Samiec
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 ?

Pozostało 580 znaków

Wybitny Samiec
2015-12-30 23:27
Wybitny Samiec
0

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

Pozostało 580 znaków

Odpowiedz

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