Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Operatory przesunięcia przesuwają swój pierwszy operand w lewo (<<) lub w prawo (>>) według liczby pozycji, które określa drugi operand.
Składnia
shift-expression:
additive-expression
shift-expression
<<
additive-expression
shift-expression
>>
additive-expression
Oba operandy muszą być wartościami całkowitymi. Te operatory wykonują zwykłe konwersje arytmetyczne; typ wyniku jest typem lewego operandu po konwersji.
W przypadku przesunięć po lewej stronie wolne prawe bity są ustawione na 0. W przypadku przesunięć od prawej strony opuszczone lewe bity są wypełniane na podstawie typu pierwszego operandu po konwersji. Jeśli typ to unsigned, są ustawione na 0. W przeciwnym razie są one wypełnione kopiami bitu znaku. W przypadku operatorów przesunięcia po lewej stronie bez przepełnienia instrukcja
expr1 << expr2
jest odpowiednikiem mnożenia przez 2wyrażenie2. W przypadku operatorów przesunięcia w prawo,
expr1 >> expr2
jest odpowiednikiem dzielenia przez 2wyrażenie 2 , jeśli expr1 jest niepodpisane lub ma wartość nienależącą.
Wynik operacji przesunięcia jest niezdefiniowany, jeśli drugi operand jest ujemny, lub jeśli prawy operand jest większy lub równy szerokości w bitach promowanego operandu po lewej stronie.
Ponieważ konwersje wykonywane przez operatory przesunięcia nie zapewniają warunków przepełnienia lub niedopełnienia, informacje mogą zostać utracone, jeśli wynik operacji przesunięcia nie może być reprezentowany w typie pierwszego operandu po konwersji.
unsigned int x, y, z;
x = 0x00AA;
y = 0x5500;
z = ( x << 8 ) + ( y >> 8 );
W tym przykładzie x jest przesunięty w lewo osiem pozycji i y jest przesunięty w prawo osiem pozycji. Wartości przesunięte są dodawane, dając 0xAA55 i przypisane do elementu z.
Przesunięcie wartości ujemnej do prawej daje połowę oryginalnej wartości, zaokrąglonej w dół. Na przykład -253 (11111111 00000011 binarne) przesunięte w prawo o jeden bit generuje -127 (11111111 10000001 binarne). Dodatnia 253 zmienia się w prawo, aby wygenerować +126.
Przesunięcia w prawo zachowują bit znaku. Gdy podpisana liczba całkowita zmienia się w prawo, najbardziej znaczący bit pozostaje ustawiony. Gdy niepodpisane liczby całkowite zmieni się w prawo, najbardziej znaczący bit zostanie wyczyszczone.