Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Арифметические операции в WinAVR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
koluna
Здравствуйте!

Объясните, пожалуйста, принцип работы компилятора на следующих тест-примерах.

Пример 1 (вычисления правильные):
Код
unsigned char Tmpr = 235 -  (unsigned long) 400 * 7800 / 14200; // = 16


Пример 2 (вычисления неправильные):
Код
unsigned char Tmpr = 235 -  400 * 7800 / 14200; // = 236


Почему требуется обязательное приведение типа одного из операндов к unsigned long, а не результата вычисления?
И почему оно вообще требуется?

Благодарю заранее!
MrYuran
400 * 7800 = 3120000
Как по-вашему, укладываемся в char?

И вообще, нафига какие-то приведения, когда сплошные константы?
unsigned char Tmpr = 235 - 400UL * 7800 / 14200; // = 16

Вменяемый компилятор должен подставить результат на уровне препроцессорной обработки
Сергей Борщ
Цитата(n_bogoyavlensky @ Sep 22 2009, 12:20) *
Почему требуется обязательное приведение типа одного из операндов к unsigned long, а не результата вычисления?
Потому что существуют правила языка. Компилятор выбирает конкретную функцию вычисления исходя из разрядности операндов. Вы же хотите, чтобы в коде
Код
uint8_t a =2; b = 3; uint32_t c = a * b;
компилятор использовал 32-битное умножение?
koluna
Цитата(MrYuran @ Sep 22 2009, 12:37) *
400 * 7800 = 3120000
Как по-вашему, укладываемся в char?


Почему в char?
Как минимум в unsigned int.

Цитата
И вообще, нафига какие-то приведения, когда сплошные константы?
unsigned char Tmpr = 235 - 400UL * 7800 / 14200; // = 16


Ну написал же: "... тестовый пример...". В реальности там переменные стоят...

Цитата
Вменяемый компилятор должен подставить результат на уровне препроцессорной обработки


Ясное дело, что с константами операции выполнятся на этапе препроцессорной обработки...
Речь не об этом...

Цитата(Сергей Борщ @ Sep 22 2009, 13:09) *
Потому что существуют правила языка. Компилятор выбирает конкретную функцию вычисления исходя из разрядности операндов. Вы же хотите, чтобы в коде
Код
uint8_t a =2; b = 3; uint32_t c = a * b;
компилятор использовал 32-битное умножение?


По поводу правил уже догадался, поэкспериментировав smile.gif
Т. е., как минимум один из операндов должен иметь тип unsigned long...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.