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
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
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.
Przesunięcie bitowe w lewo operatora w C:
Składnia:
**[variable]<<[number of places]**
Jeśli ilość miejsc stać się ujemny, to będzie niezdefiniowana
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ą.
"... gcc da ostrzeżenie ...": ale tylko wtedy, gdy potrafi wykryć czas kompilacji, tzn. czy liczba zmian jest stała, jak w pytanie. – Olaf
Przesunięcie z lewej strony z -1 wygląda jak przesunięcie w prawo z 1 – adricadar
@adricadar: Wygląda (i czasami tak jest), ale: Zasadnie nie tak. – Olaf
Uwaga: Ponieważ OP mówi "liczba", istnieje inne ograniczenie: "Każdy z operandów powinien mieć typ całkowity". – chux