Неожиданные выходы в режиме левого сдвига ...? - PullRequest
0 голосов
/ 24 октября 2010

Я прочитал, что сдвиг влево e1<<e2 эквивалентен e1* 2e2. Но для кода:

x=5;
printf("%d",x<<3);

Выход составляет 40 , но, по моему мнению, должно быть 30 . а для x<<4 это 80 . (но ожидается 40 ).

Хотя для x<<1 и x<<2 выходы 10 и 20 , как и ожидалось.

Пожалуйста, объясните эту логику.

Ответы [ 2 ]

4 голосов
/ 24 октября 2010

00000101 = 4 + 1 = 5

00101000 = 32 + 8 = 40

Сдвиг влево не является последовательным умножением на 2, 4, 6, 8 (то есть x * 2) - это последовательное умножение на 2, 4, 8, 16 (то есть x ^ 2).

1 голос
/ 24 октября 2010

Нет, 40 совершенно верно ...

То, что вы, кажется, ожидаете, это: "x * 2 * n", но сдвиг влево - это другая операция.Вы можете думать о сдвиге влево как о эффективном «x * 2 ^ n», где n - это число - в вашем случае 3. Так что вы делаете 5 * 8, что равно 40.

То же самое касается 80: 5 * 16, то есть 80.

...