Операторы левого сдвига в c

Я изучаю операторы левого сдвига и для умножения числа на 10 я использую этот код.

long int num=a<<3+a<<1;

так что нет. сначала умножается на 8, а затем на 2, и при добавлении получает *10, который хранится в num.

Но это дает какой-то странный результат, как for 5 its 2560, for 6 its 6144.

Может кто-нибудь объяснить, что не так в этой реализации?

5 ответов

Решение

Формат, который вы используете, на самом деле идет по этому пути..

num=a<<(3+a)<<1;

сделать некоторую разницу между двумя приложениями операторов сдвига с помощью скобок, таких как

num=(a<<3)+(a<<1);

У вас проблема с приоритетом - операторы заказа выполняются. + связывает более плотно, чем <<, поэтому:

а<<3+ а << 1

на самом деле означает: << (a+3) << 1

для 5 это 5 << 8 << 1 что 2560:)

Вам нужно: (a<<3) + (a<<1)

Смотрите: http://www.swansontec.com/sopc.html для уточнения.

Как насчет warning: suggest parentheses around ‘+’ inside ‘<<’

+ обрабатывается до <<,

использование (a<<3)+(a<<1)

Оператор<< имеет меньший приоритет, чем оператор + (правило Thumb Unary Arthematic Relational Logical)

так что используйте брекеты

     int num = (a<<3) + (a<<1);
Другие вопросы по тегам