Przesunięcia bitowe a zmiana bitu na skrajnej lewej pozycji.

Odpowiedz Nowy wątek
2017-12-16 21:17
0

Witam, w podręczniku do C, który jest tutaj: https://pl.wikibooks.org/wiki/C/Operatory#Operacje_bitowe jest napisane:

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 prosty kod w C++ daje zupełnie inne wyniki.

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

Wyniki:

11111111
11111110
01111111
A zgodnie z tym co było napisane wynikiem powinno być:
11111111
11111110
11111111
Więc jak to jest z tymi przesunięciami? Ich wynik jest zależny od platformy sprzętowej czy w podręczniku jest błąd?

Pozostało 580 znaków

2017-12-16 21:19
kq
1

Dzięki integer promotion pracujesz na intach, więc przy 32-bitowych intach masz 00000000 00000000 00000000 111111112 przesuwane i potem obcinane do 8 bitów.


Pozostało 580 znaków

2017-12-16 21:24
0

@kq Czyli reguła w Wikibooks jest prawdziwa?

Pozostało 580 znaków

2017-12-16 21:25
kq

Dla liczb ze znakiem tak1, dla tych bez znaku nie.

1Przy czym to jest chyba implementation defined.


Pozostało 580 znaków

2017-12-16 21:28
Trzeźwy Ogrodnik
0

Ale jest kilka różnych przesunięć bitowych shr przesunięcie w prawo np. z 1111 na 0111, shl z 1111 na 1110, ror z 1111 na 1111, rol z 0111 na 1110 itp.

Mówimy o C++. - kq 2017-12-16 21:31

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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