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

Re: Как разбить двухбайтную переменную на 2 байта в СИ?

Ср дек 08, 2021 11:20:23

тогда компилятор для промежуточных вычислений зарезервирует 16 бит переменную (2 регистра)

Он это и так сделает.
Писал бы TC на С++ в более-менее нормальной IDE, тогда мог бы сделать так и посмотреть какой у суммы тип:

Изображение

Re: Как разбить двухбайтную переменную на 2 байта в СИ?

Ср дек 08, 2021 11:40:24

GoldenAndy писал(а):Ардуина - это плюсы, соответственно, все прелести ООП доступны.
Какой компилятор используется? avr-g++?
Это стандартный компилятор, который входит в набор WinAVR-20100110, и это не чистый c++.

Re: Как разбить двухбайтную переменную на 2 байта в СИ?

Ср дек 08, 2021 11:51:36

Ivanoff-iv писал(а):тут лучше написать так:
Код:
sum = (uint16_t) (var[0] + var[1] + var[2]) / 3;

Я таки дико извиняюсь, но тут просто повезло, что по умолчанию компилятор приводит вычисления к int (avr gcc приводит к знаковому int).

Ибо вы приводите к uint16_t результат сложения.
Т.е. сначала выполнится сложение в скобках, а потом приведение результата.
Разрядность результата операции - это максимальная разрядность операндов.
У операции (var[0] + var[1] + var[2]) все операнды 8-битные.

Правильно вот так:
Код:
sum = ( (uint16_t)var[0] + var[1] + var[2]) / 3;


Тогда для выражения в скобках результат будет принят как uint16_t и не потеряются значения на переполнении.
Результат скобок будет uint16_t, деление на 3 тоже пройдет в 16-битной математике.


Dimon456, я не знаю, какой компилятор пользует абдурина. Не пользовался.
У меня есть одна или две наны на меге 328, исключительно как удобный формфактор для втыкания в макетку.
А для написания кода - АВР студия.
Вложения
arv1.jpg
(159.17 KiB) Скачиваний: 309

Re: Как разбить двухбайтную переменную на 2 байта в СИ?

Ср дек 08, 2021 12:58:33

GoldenAndy писал(а):Правильно вот так:
Код:
sum = ( (uint16_t)var[0] + var[1] + var[2]) / 3;


Спасибо! Были такие подозрения. :)

Добавлено after 3 minutes 4 seconds:
Учусь в CVAVR. Ардуино не использую, так как не вижу ни каких перспектив кроме домашних поделок.

Re: Как разбить двухбайтную переменную на 2 байта в СИ?

Ср дек 08, 2021 13:02:53

GoldenAndy писал(а):Я таки дико извиняюсь,
да, точно, поторопился... :oops:
но! кодевижен не всегда приводит к инту - его поведение зависит от наличия галочки Project->configure->C Compiler->Promote char to int

Re: Как разбить двухбайтную переменную на 2 байта в СИ?

Ср дек 08, 2021 13:22:33

Ivanoff-iv, полезная информация. Спасибо! :)

Re: Как разбить двухбайтную переменную на 2 байта в СИ?

Ср дек 08, 2021 13:54:16

Ivanoff-iv, ситуация в том, что никогда нельзя доверять дефолтовым настройкам и умолчаниям. К примеру, знаковость char...
правильней помнить о приведении типов и учитывать выходы за диапазоны, что бы не выстрелить себе в ногу.
Ответить