Операторы левого сдвига в 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 ‘<<’
Оператор<< имеет меньший приоритет, чем оператор + (правило Thumb Unary Arthematic Relational Logical)
так что используйте брекеты
int num = (a<<3) + (a<<1);