Что происходит, когда вы сдвигаете бит после конца переменной? - PullRequest
3 голосов
/ 02 декабря 2010

Если у вас есть некоторая переменная (в стеке) и вы сдвигаете бит влево или вправо за ее конец, что происходит?приведение к байту и вы делаете то же самое?

byte* x = obtain pointer from somewhere;
*x = 1;
*x >> N;

Ответы [ 5 ]

7 голосов
/ 02 декабря 2010

Не обязательно (обязательно) становится ноль. Поведение не определено (C99 §6.5.7, «Операции побитового сдвига»):

Если значение правого операнда отрицательно или больше или равно на ширину повышенного слева операнд, поведение не определено.

(C ++ 0x §5.8, «Операторы сдвига»):

Поведение не определено, если право операнд отрицательный или больше или равна длине в битах повышен левый операнд.

Хранение смещаемого значения не влияет ни на что из этого.

5 голосов
/ 02 декабря 2010

Я думаю, вы не понимаете, что делают сдвиги.Это арифметические операторы, эквивалентные умножению или делению на степень 2 (по модулю некоторая странность в том, как C обрабатывает отрицательные числа). Они не перемещают биты в памяти .Единственный способ изменить содержимое любой переменной / памяти - это присвоить результат выражения где-нибудь обратно.

Что касается того, что происходит, когда правый операнд оператора побитового сдвига больше или равен ширинетипа левого выражения поведение не определено.

3 голосов
/ 02 декабря 2010

Я думаю, вы в замешательстве. x >> y фактически не меняет x . Он рассчитывает новое значение.

Как заметил Стивен, y не должно быть отрицательным, и оно должно быть меньше, чем "ширина повышенного левого операнда" (читайте о повышении типа). Но в противном случае биты, которые сдвигаются "с конца", просто отбрасываются. 1 >> 2 (обратите внимание, что 2 не является отрицательным, и это меньше, чем число битов, используемых для представления 1, что, вероятно, 32, но, безусловно, по крайней мере 16) оценивается в 0.

0 голосов
/ 02 декабря 2010

Это просто становится все ноль. Так что какой бы длины она ни была, но в нулях.

то есть, скажем, двоичный файл равен 001, после 3-битных сдвигов он будет равен 000. Никакого обтекания не происходит, и он не перемещает местоположение (если только вы не сдвигаете указатель по битам, и тогда я не знаю).

0 голосов
/ 02 декабря 2010

Вы получаете ноль. Нет переноса в другие области памяти. С тем же успехом вы могли его очистить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...