Например TDA7294

Форум РадиоКот • Просмотр темы - Переполнение при умножении
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Чт окт 16, 2025 08:23:17

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Переполнение при умножении
СообщениеДобавлено: Ср дек 22, 2021 22:49:10 
Прорезались зубы
Аватар пользователя

Зарегистрирован: Вт фев 05, 2019 17:20:08
Сообщений: 230
Откуда: Днепр, Украина
Рейтинг сообщения: 0
Всем привет. Не могу понять в чем проблема.
Имею следующую строку кода: veight = (adc_send * veight_etal) ;
veight - 64бит
adc_send - 32бит
veight_etal - 32бит константа = 1000
когда adc_send приближается к значению 4509930 то происходит переполнение и в переменной veight я получаю 107 в место 4509930000
почему так происходит? ведь переменная результата 64 бит
а если сделать adc_send - 64бит то все работает как нужно

_________________
Одержать сто побед в ста битвах — это не вершина воинского искусства. Повергнуть врага без сражения — вот вершина.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Переполнение при умножении
СообщениеДобавлено: Ср дек 22, 2021 23:00:09 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 1
Потому что сначала происходит умножение, и только потом - приведение к нужному типу. Можете объявить свою константу как 1000ULL, например.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Переполнение при умножении
СообщениеДобавлено: Ср дек 22, 2021 23:03:51 
Говорящий с текстолитом

Карма: 25
Рейтинг сообщений: 462
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1698
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
Попробуйте

uint64_t veight = ((uint64_t)adc_send * veight_etal);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Переполнение при умножении
СообщениеДобавлено: Ср дек 22, 2021 23:08:55 
Прорезались зубы
Аватар пользователя

Зарегистрирован: Вт фев 05, 2019 17:20:08
Сообщений: 230
Откуда: Днепр, Украина
Рейтинг сообщения: 0
так что получается, что умножение происходит в переменную adc_send ? а потом только в veight ?

Добавлено after 1 minute 25 seconds:
uint64_t veight = ((uint64_t)adc_send * veight_etal);
так легче уже саму переменную сделать 64 бит и все.
или в вашем примере мы потом не будем занимать память?

_________________
Одержать сто побед в ста битвах — это не вершина воинского искусства. Повергнуть врага без сражения — вот вершина.


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Переполнение при умножении
СообщениеДобавлено: Ср дек 22, 2021 23:14:08 
Говорящий с текстолитом

Карма: 25
Рейтинг сообщений: 462
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1698
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
Зависит от компилятора. Должно занимать немного больше памяти только во время выполнения операции.
А некоторые компиляторы достаточно "умны" и это не имеет значения - будет оптимизация и будет такой же объем памяти.

Можно и так:
Код:
uint32_t adc_send = 4509930;
uint32_t veight_etal = 1000;
...
uint64_t veight = adc_send;
veight *= veight_etal;


Последний раз редактировалось veso74 Ср дек 22, 2021 23:22:41, всего редактировалось 4 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Переполнение при умножении
СообщениеДобавлено: Ср дек 22, 2021 23:19:22 
Прорезались зубы
Аватар пользователя

Зарегистрирован: Вт фев 05, 2019 17:20:08
Сообщений: 230
Откуда: Днепр, Украина
Рейтинг сообщения: 0
ага, понял. спасибо
но вот еще бы понять почему происходит переполнение? из за того что оно само в себя складывает результат умножения?

_________________
Одержать сто побед в ста битвах — это не вершина воинского искусства. Повергнуть врага без сражения — вот вершина.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Переполнение при умножении
СообщениеДобавлено: Чт дек 23, 2021 09:12:58 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
Я же написал: u32*u32=u32
Но u32*u64=u64, поэтому достаточно привести хоть один аргумент к 64 битам чтобы результат туда влезал.
Аналогично int*int=int, int/int=int, но при этом int*float=float и int/float=float. Именно поэтому 1/2=0, но 1.0/2=0.5


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Переполнение при умножении
СообщениеДобавлено: Чт дек 23, 2021 11:37:09 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 66
Рейтинг сообщений: 536
Зарегистрирован: Чт июл 28, 2016 07:58:37
Сообщений: 1925
Откуда: Kyiv, UA
Рейтинг сообщения: 1
Тип результата выражения определяется максимальным типом операндов. На тип результирующей переменной компилятор не смотрит.
Изображение

_________________
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Переполнение при умножении
СообщениеДобавлено: Чт дек 23, 2021 19:19:15 
Прорезались зубы
Аватар пользователя

Зарегистрирован: Вт фев 05, 2019 17:20:08
Сообщений: 230
Откуда: Днепр, Украина
Рейтинг сообщения: 0
спасибо. а подскажите из какой книги этот скрин?

_________________
Одержать сто побед в ста битвах — это не вершина воинского искусства. Повергнуть врага без сражения — вот вершина.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Переполнение при умножении
СообщениеДобавлено: Чт дек 23, 2021 19:54:57 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 66
Рейтинг сообщений: 536
Зарегистрирован: Чт июл 28, 2016 07:58:37
Сообщений: 1925
Откуда: Kyiv, UA
Рейтинг сообщения: 0
Roman Solovey, ищите в гугле
"Книга по работе с WinAVR и AVR Studio"

Это книга (или цикл статей) автора Романа Абраша. Книга автором не дописана.

ЗЫ. Автор присутствует на форуме :)

_________________
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Переполнение при умножении
СообщениеДобавлено: Чт дек 23, 2021 20:33:24 
Прорезались зубы
Аватар пользователя

Зарегистрирован: Вт фев 05, 2019 17:20:08
Сообщений: 230
Откуда: Днепр, Украина
Рейтинг сообщения: 0
спасибо. буду изучать)

_________________
Одержать сто побед в ста битвах — это не вершина воинского искусства. Повергнуть врага без сражения — вот вершина.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Переполнение при умножении
СообщениеДобавлено: Пт дек 24, 2021 01:41:11 
Мучитель микросхем
Аватар пользователя

Карма: 8
Рейтинг сообщений: 76
Зарегистрирован: Пт фев 17, 2017 11:18:07
Сообщений: 460
Откуда: Ставрополь-Донское
Рейтинг сообщения: 0
ага. предсказанное будущее начинается.
расскажу на микрочипе, пусть поржут
===============
...
имхо, те, которые топовые- скоро на "андуриновую" структуру перейдут...
а, фигли, вот вам - "outUSB2.0(byte)"... и не думайте.... там всё уже работает....
но, ножки трогать- низя.....

наверное- это хорошо.... скорость разработки увеличивается... но... с другой- "болты" закручивают- в плане творчества....
.....
К сожалению, по причине ограниченной продолжительности жизни, придётся решать, что приоритетнее.
На ногодрыге ВСЁ сделать нельзя (не хватит времени на решение задачи). Надо отдавать что-то на откуп другим людям - или разработчикам кремния (хардварный USB тот-же), или (далее) авторам компиляторов, или (далее) каким-то осям и бибилиотекам ( и т.д.).
Большинство уже сделало выбор в пользу "сейчас любой ценой". Все стареют ведь. А надо успеть.
Жду не дождусь, когда ардуинские "скетчи" начнут применять в ответственных приложениях.
Закупился попкорном в ожидании какого-нибудь мирового коллапса, устроенного программистами (типа, перестали работать все банковские карточки мира на три дня или что-то в этом духе).Только после глабального 3.14здеца может поменяться вектор коллективного восприятия действительности (и то - не факт, к сожалению)

_________________
LIVE - EVIL


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Максим Пахтусов и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y