Обсуждаем контроллеры компании Atmel.
Ответить

Проблема в вычислении AVR Studio

Чт ноя 11, 2021 14:15:05

Приветствую.
Помогите разобраться
Код:
char bufer[32];
uint32_t y=(10000*buf.dig5);
sprintf(bufer,"%lu",y);

далее вывожу на lcd.
buf.dig5, эта цифра должна стоять пятой, (buf.dig2 второй, buf.dig3 третьей) какая бы там цифра не была, то при умножении на 10000 у меня получается чёрт знает что. При компиляции вылазит предупреждение ../transmit.c:19:18: warning: integer overflow in expression - целочисленное переполнение в выражении. Почему-то такая фигня вылазит только при умножении на 10000, подставлял и 100к и 1кк и 100, всё норм, вместо buf.dig5 подставляю напрямую цифру 10000*4, и тоже самое. Куда копать? Или как можно buf.dig установить в нужное положение без умножения?

Re: Проблема в вычислении AVR Studio

Чт ноя 11, 2021 14:27:11

Компилятор любит все к int приводить и если он 16-ти битный, как на AVR, то и результат будет соответствующий, а потом ты его уже uint32_t переменной присваиваешь.

Re: Проблема в вычислении AVR Studio

Чт ноя 11, 2021 14:47:30

Сделал преобразование типов к uint32_t, так работает. Но вопрос остаётся открытым, почему умножая например на 10 000 000 результат правильный. С float y= тоже работает правильно.

Re: Проблема в вычислении AVR Studio

Чт ноя 11, 2021 15:01:22

10'000'000 в 16 бит не влазит и тип уже будет long, а не int.

Re: Проблема в вычислении AVR Studio

Чт ноя 11, 2021 15:18:25

Я понял. Компилятор приводит к минимальному типу данных множители, и не учитывает что результат может не влезть в этот тип.

Re: Проблема в вычислении AVR Studio

Чт ноя 11, 2021 15:22:09

Как выше уже сказали, у avr-gcc тип 16-разрядный по умолчанию. Сам частенько баги ловил из-за этого.
Просто когда прыгаешь по кругу AVR - STM32 - PC, то с непривычки появляются такие вот опечатки.
Ответить