Умножение (40*1000) не вычисляет правильно!!!
- Войдите на сайт для отправки комментариев
Вс, 16/10/2016 - 18:38
Столкнулся с тем, что в для оператора if задал условие (t<60*60*1000) - условие не работало. Тогда заменил операцию с числами на переменную:
unsigned long t = 60*60*1000;
Не помогло! Вывел на монитор порта переменную t: показывает число 4294941760
Самое интересное, что (30*1000) вычисляет, а (40*10000) уже нет!
Если подставить вместо (unsigned long t = 60*60*1000;) - (unsigned long t = 3600000;) - показывает правильно!
Кто-нибудь знает в чем дело?
Vitamin, объявлять тип переменной нужно как для левой так и для правой части выражения.
Спасибо, кажется разобрался. Дело в том, что результат любой операции с числами по умолчанию, если числа не имеют дробную часть записывается с типом int, то есть если результат будет больше 32767, то он будет записан неправильно.
Не работает:
unsigned int t = 60*60*1000;
Работает:
А как (t< 60UL*60UL*1000UL) ?
Спасибо, кажется разобрался.
Непохоже что разобрался. Я ожидал увидеть что-то вроде этого:
unsigned long x = 60*60*1000ul;
unsigned long y = (unsigned long) 60*60*1000;
При вычислении выражений, в качестве типа результата используется тип первой величины. типа:
f = 60L * 1000; // здесь результат будет считаться как long (60L) потом преобразуется в тип переменной f
Чтобы не было лажи или лотереи, проще всего приводить типы всегда, тогда и проблем будет меньше.
Не нравится - используй другой компилятор и забей на С++, ну такой он, хотя лично я не нахожу в этом ничего плохого.
При вычислении выражений, в качестве типа результата используется тип первой величины.
Точнее, "наибольшего" вне зависимости от номера операнда.
Не нравится - используй другой компилятор и забей на С++, ну такой он, хотя лично я не нахожу в этом ничего плохого.
Вообще-то в С/С++ используется стандартный подход для языков высокого уровня. Так что искать компилятор, который бы реализовал какую-то другую арифметику, лично мне представляется не очень перспективным.
Пожалуй да, на счет простых типов, погорячился, чаще приходится таким образом строки собирать, а там объекты и несколко другой порядок вычисления.