неявное преобразование типов данных
- Войдите на сайт для отправки комментариев
Ср, 30/09/2015 - 21:54
Добрый день!
Подскажите, как правильно нужно писать, чтобы не было неявного преобразования типов.
Вот этот код не работает:
int a=5000; void loop() { .... lastmove=millis(); .... if (millis()-lastmove<a*1UL) { delaem.....}}
А вот этот код работает:
void loop() { .... lastmove=millis(); .... if (millis()-lastmove<5000UL) { delaem.....}}
Нужно задать время (5000 мс) через переменную. как это правильно сделать?
Какой тип возвращает millis()? Посмторите её описание. Возвращает она unsigned long. Ну так и описывайте переменную для сравнения с нею этим же типом:
unsigned long
a=5000;
по другому никак? А почему не работает (a*1UL)?
А lastmove как описано?
unsigned long lastmove=1UL;
Понятно. Ну и что Вас не устраивает? Для чего Вы спрашиваете "по другому никак?". Для чего Вам по-другому?
Почему не работает a*1UL? Вам это из академических соображений интересно? Возможно, потому что константа 1 вполне помещается в int. См. п. 6.3.1.1.2 стандарта С
Также см. п. 6.3.1.3 того же стандарта:
Обычно (в большинстве компиляторов) всё работает с преобразованием. Но стандарт, как видите, допускает двойное толкование для констант поэтому, возможно (я далеко не уверен) в Вашем случае преобразование не проведено, хотя я бы проверил это отдельно.
А вообще, преобразования типов нужно делать явно. Стандарты неявного преобразования во-первых сильно запутаны и местами неоднозначны, а во-вторых - это то, что разработчики реализаций нарушают наиболее часто.