Умножение (40*1000) не вычисляет правильно!!!

Vitamin
Offline
Зарегистрирован: 16.10.2016

Столкнулся с тем, что в для оператора 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;) - показывает правильно!

Кто-нибудь знает в чем дело? 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Vitamin, объявлять тип переменной нужно как для левой так и для правой части выражения.

Vitamin
Offline
Зарегистрирован: 16.10.2016

Спасибо, кажется разобрался. Дело в том, что результат любой операции с числами по умолчанию,  если числа не имеют дробную часть  записывается с типом int, то есть если результат будет больше 32767, то он будет записан неправильно.

Не работает:

unsigned int t = 60*60*1000; 

Работает:

int t1= 60;
unsigned long t2 = 1000;
unsigned long t3 = t1*t1*t2; 
или
double t4 = 1000.0*60*60;

 

nik182
Offline
Зарегистрирован: 04.05.2015

А как (t< 60UL*60UL*1000UL) ?

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Vitamin пишет:

Спасибо, кажется разобрался.

Непохоже что разобрался.  Я ожидал увидеть что-то вроде этого:

unsigned long x = 60*60*1000ul;
unsigned long y = (unsigned long) 60*60*1000;

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

При вычислении выражений, в качестве типа результата используется тип первой величины. типа:

f = 60L * 1000; // здесь результат будет считаться как long (60L) потом преобразуется в тип переменной f

Чтобы не было лажи или лотереи, проще всего приводить типы всегда, тогда и проблем будет меньше.

Не нравится - используй другой компилятор и забей на С++, ну такой он, хотя лично я не нахожу в этом ничего плохого.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

kisoft пишет:

При вычислении выражений, в качестве типа результата используется тип первой величины.

Точнее, "наибольшего" вне зависимости от номера операнда.

Цитата:

Не нравится - используй другой компилятор и забей на С++, ну такой он, хотя лично я не нахожу в этом ничего плохого.

Вообще-то в С/С++ используется стандартный подход для языков высокого уровня. Так что искать компилятор, который бы реализовал какую-то другую арифметику, лично мне представляется не очень перспективным.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Пожалуй да, на счет простых типов, погорячился, чаще приходится таким образом строки собирать, а там объекты и несколко другой порядок вычисления.