2015-07-21 32 views
11

Jaki jest wynik liczby po przesunięciu w lewo o -1 w programowaniu C przy użyciu operatora przesunięcia w lewo ?Jaka jest wartość przesuniętej liczby o -1

np

23 << -1 
+2

Przesunięcie z lewej strony z -1 wygląda jak przesunięcie w prawo z 1 – adricadar

+0

@adricadar: Wygląda (i czasami tak jest), ale: Zasadnie nie tak. – Olaf

+0

Uwaga: Ponieważ OP mówi "liczba", istnieje inne ograniczenie: "Każdy z operandów powinien mieć typ całkowity". – chux

Odpowiedz

9

Od C11 standardowy 6.5.7p3 (za dawnych wersjach to jest w zasadzie taka sama):

„Jeżeli wartość prawego argumentu jest ujemna lub jest większa lub równy szerokości promowanego lewego operandu, zachowanie jest niezdefiniowane. "

IOW: undefined behaviour. Przygotuj się na nasal demons.

skrócie: Nie

Uwaga: Choć wielu programistów są tego świadomi i uniknąć negatywnych liczy przesunięcia, często ignorowane, że również liczy >= bit-size wartości są również niezdefiniowane. To sprawia, że ​​coś w rodzaju ((unsigned int)1 << 32) - 1 jest w rzeczywistości niezdefiniowane, jeśli unsigned int ma 32 bity lub mniej. Dla wartości podpisanych rzeczy stają się more complicated ze względu na znak (dzięki @chux za wskazanie mi na to). Jest to powszechna pułapka. W przypadku niektórych implementacji mogą wystąpić różne wyniki dla stałych wyrażeń (oszacowane w czasie kompilacji) i analizy czasu pracy.

+1

Nie jest to '((int) 1 << 31) - 1' również nieokreślone jeśli' int' ma 32 bity lub mniej? – chux

+0

@chux: Zaktualizowano – Olaf

0

Przesunięcie bitowe w lewo operatora w C:

  1. Bit Wzór danych może zostać przesunięty o określoną liczbę pozycji do lewej
  2. gdy dane są przesunięte w lewo, na końcu zera są wypełnione zera.
  3. Operator dźwigni lewostronnej jest operatorem binarnym [Bi - dwa]
  4. Sterownik binarny, operator wymagający dwóch argumentów!

Table

Składnia:

**[variable]<<[number of places]** 

Jeśli ilość miejsc stać się ujemny, to będzie niezdefiniowana

1

Jak Olaf powiedział w swojej odpowiedzi, lewo przesuwanie przez liczbę ujemną jest niezdefiniowany.

W rzeczywistości gcc wyświetli ostrzeżenie, jeśli spróbujesz przesunąć w dowolnym kierunku o liczbę ujemną.

+3

"... gcc da ostrzeżenie ...": ale tylko wtedy, gdy potrafi wykryć czas kompilacji, tzn. czy liczba zmian jest stała, jak w pytanie. – Olaf