Я не понимаю сдвиги - PullRequest
0 голосов
/ 29 января 2019

Я понимаю, что операторы смещения выполняют умножение и деление на число.Поэтому, когда у меня есть 80 >> 3, я перевожу его, разделив 80 на два, три раза.И когда я вижу это 80 <<< 3, я перевожу его, умножая 80 на два, три раза.Но я не правильно понял, потому что я не понимаю, что: 9 <<< 99 = 72, потому что я ожидал, что 9 умножится на два, 99 раз, поэтому 9 * (2 ^ 99).Но на самом деле нет, это не работает .... Я читал разные статьи, но я все еще не понимаю. </p>

1 Ответ

0 голосов
/ 29 января 2019

Следует помнить о сдвиге битов: ваши значения имеют только конечное число битов, и (по крайней мере, для примитивных типов значений) это число битов будет меньше 99.

На самом деле, если вы скомпилируете свой код с включенными предупреждениями, вы, вероятно, увидите следующее предупреждение:

`warning: shift count >= width of type [-Wshift-count-overflow]`

... это компилятор, который говорит вам, что вы пытаетесь сделатьвызывает неопределенное поведение.Скорее всего, смещаемое вами значение имеет длину 32 или 64 бита (в зависимости от вашего кода и / или компьютера, для которого вы компилируете), поэтому сдвиг влево на большее количество битов, чем это недопустимо.

...