taras1978
@taras1978
почти программист

Как правильно сделать приведение типов в Си?

Здравствуйте.
Делаю на микроконтроллере AVR частотомер.
Как правильно привести тип результата, для отображения на екране или передаче через UART.
У меня выходят вообще неправильные результаты именно из-за преобразования.
Например 234 или 000000. А должно быть 1024 с желательно с дробной частью (или без), хотя бы какого то результата.
По ниже приведенной формуле не работает. Получаются нули, а должно получиться 10004,03085khz
или хотя бы 10004 или 100040308
unsigned long result = (16000000UL*(unsigned long)mesurImp)/baseImp;
mesurImp = 10171;
baseImp = 16267043;
Как получить правильный результат ?
  • Вопрос задан
  • 432 просмотра
Решения вопроса 1
taras1978
@taras1978 Автор вопроса
почти программист
Нашел решение.
Для Atmel studio надо было изменить настройки компилятора.
Для того, чтобы он выводил числа float b double.
поставить галочку vprintf library(-Wl,-u,vfprintf).
И установить флаг -lprintf_flt
Подробнее здесь
https://startingelectronics.org/articles/atmel-AVR...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
15432
@15432
Системный программист ^_^
unsigned long у вас наверняка 32-битный. И его максимальное значение 4294967295, поэтому при умножении переполнение происходит.

используйте unsigned long long, или считайте в типах с плавающей запятой (float, double)
Ответ написан
@vanyamba-electronics
В AVR-GCC размеры типов следующие:
  • char, unsigned char = uint8_t
  • short, unsigned short = uint16_t
  • int, unsigned int = uint16_t
  • long, unsigned long = uint32_t

Таким образом переменные mesurImp и baseImp должны быть типа unsigned long.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы