Оператор вправо - PullRequest
       0

Оператор вправо

1 голос
/ 07 марта 2011

Я провел сегодня несколько часов в поисках жука, пока не нашел что-то, чего я не понимаю.

Это код, с которым я работал:

unsigned long k,l,m;
k = 1000;
l = 33;
m = k>>l;

Это дает m=500, то есть, по-видимому, сдвигается l mod 32!

Я логически ожидал 0.

Я что-то упустил из виду и никогда не замечал?

Ответы [ 3 ]

1 голос
/ 07 марта 2011

Стандарт ANSI C гласит:

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

Итак, смещение на 33 - это не то же самое, что 33 смещения на 1 ...

1 голос
/ 07 марта 2011

В C, я полагаю, не указано, что произойдет, если вы используете сдвиги, которые слишком велики для размера смещаемого значения, поэтому вполне приемлемо иметь перенос числа сдвигов (и это то, что x86 и IIRC PowerPC сделать). В Java поведение обтекания, которое вы видели, является обязательным.

0 голосов
/ 26 апреля 2011

Есть ли вероятность, что вы путаете 1 (один) и 1 (букву L), как это случилось со мной раньше !!(возможно, проверьте дважды, изменив x = 33; m = k >> x?)

...