Wpis z mikrobloga

Zauważyłem coś nietypowego w podręczniku do C: https://pl.wikibooks.org/wiki/C/Operatory#Operacje_bitowe który mówi:

Przesunięcie w prawo oznacza przemieszczenie wszystkich bitów argumentu w prawo o określoną liczbę miejsc oraz powielenie najstarszego bitu na skrajnej lewej pozycji.

Jednak następujący kod:

#include
#include
using namespace std;
int main()
{
unsigned char x = 255;
cout<(x)<<"\n";
cout<(x<<1)<<"\n";
cout<(x>>1)<<"\n";
return 0;
}

Daje następujące wyniki:
11111111
11111110
01111111
A według podręcznika powinien on pokazać:
11111111
11111110
11111111
Zamiast powielić najstarszy bit, w trzeciej linijce, na skrajnej lewej pozycji zostało wypisane 0, zamiast 1.
Więc jak to jest z tymi przesunięciami bitowymi? Ich wynik zależy od platformy sprzętowej, mój tok rozumowania jest zły czy w podręczniku jest błąd?
#c #cpp #programowanie #pytanie
  • 4
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@arkadiusz97: tak jak u góry ktoś napisał, liczba, która jest powielana w przesunięciu ma taką samą wartość jak bit znakowy, np:
a) 1.01101 -> 1.101101
b) 0.11011 -> 0.011011

liczba przed kropką oznacza bit znakowy (1 - liczba ujemna, 0 - liczba dodatnia)
  • Odpowiedz
@arkadiusz97: jest jak najbardziej dobrze, to Ty źle zrozumiales

po pierwsze jest roznica miedzy shiftem ( SHL/SHR ) a rollem ( ROL/ROR ), jedno przesuwa bit na drugi koniec, drugie tylko zeruje. Ty tutaj robisz ewidentnie robisz operacje bez przesuwania na koniec, wiec po shifcie w lewo straciles jeden bit informacji, a po powrocie ze wzgledu na brak bitu na poczatku wstawiono zero
  • Odpowiedz