Easyelectronics.ru

Электроника для всех
Текущее время: 22 сен 2018, 16:28

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: IAR long long не работает
СообщениеДобавлено: 07 июн 2018, 10:42 
Старожил

Зарегистрирован: 23 авг 2014, 11:01
Сообщения: 605
В общем, написал вот такой рекурсивный фильтр:
Show

Фильтр полностью рабочей, но если заменить строчку static unsigned int y на static unsigned long long y то фильтр перестает работать. А именно, когда досчитывает до n = 128 переменная "y" просто начинает увеличиваться на какое-то не понятное число после прохождения строчки y=y+(x-m[n]). Все остальные переменные ведут себя правильно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IAR long long не работает
СообщениеДобавлено: 07 июн 2018, 10:54 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 641
zhilenkov писал(а):
но если заменить строчку static unsigned int y на static unsigned long long y то фильтр перестает работать.

Не удивительно, функция то по-прежнему возвращает unsigned int.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IAR long long не работает
СообщениеДобавлено: 07 июн 2018, 11:01 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2507
Откуда: Санкт-Петербург
Выглядит как полная херня, откровенно говоря - и long long ни при чём. В строке y=y+(x-m[n]) значение в скобках всегда положительное. Скобки уберите.


Последний раз редактировалось aamonster 07 июн 2018, 11:17, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IAR long long не работает
СообщениеДобавлено: 07 июн 2018, 11:16 
Старожил

Зарегистрирован: 23 авг 2014, 11:01
Сообщения: 605
aamonster писал(а):
Выглядит как полная херня, откровенно говоря - и long long ни при чём. В строке y=y+(x-m[n]) значение в скобках всегда положительное.
Как так? x - это новое измерение, m[n] массив старых измерений (назовем история измерений). Новое измерение может быть меньше или больше старого. Если новое измерение меньше, то результат в скобках имеет отрицательный знак, если больше положительный. Поэтому все норм.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IAR long long не работает
СообщениеДобавлено: 07 июн 2018, 11:21 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2507
Откуда: Санкт-Петербург
Сорри, я тупанул. Оно действительно всегда положительно (переполнение, не бывает отрицательных unsigned), но это не страшно, пока x, y и m[n] unsigned одной длины. Баг будет, если станут разной.

Просто такой код глаз режет, как и использование явно не проинициализированных переменных.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IAR long long не работает
СообщениеДобавлено: 07 июн 2018, 13:37 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 198
zhilenkov писал(а):
aamonster писал(а):
Если новое измерение меньше, то результат в скобках имеет отрицательный знак, если больше положительный. Поэтому все норм.

Не будет ни какого отрицательного знака. Т.к. оба операнда являются беззнаковыми, поэтому и результат будет беззнаковым. И при дальнейшем сложении с 'unsigned long long' значение 'y' будет всегда только увеличиваться на беззнаковое значение выражения (x-m[n]).
В случае использования типа 'unsigned int' фильтр работает только благодаря переполнению, а с 'unsigned long long' переполнения уже нет.
Если логика функции подразумевает использование "отрицательных знаков", то надо использовать знаковые типы 'signed int' или 'signed long long'.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IAR long long не работает
СообщениеДобавлено: 08 июн 2018, 13:24 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2507
Откуда: Санкт-Петербург
Более того, уточню: по стандарту C++ (и, кажется, просто C) переполнение беззнакового (в т.ч. вычитание большего из меньшего) ведёт к "заворачиванию" результата (считаем по модулю 65536 для 16-битовых), а для signed - это undefined behaviour. Так что если считать в signed - надо убедиться, что все переменные достаточной длины. А если в unsigned - что переполнение работает ровно так, как вы ожидаете (для случая в теме - проще всего, чтобы x, y и m[n] были одного и того же unsigned типа)


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

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


Кто сейчас на конференции

Сейчас этот форум просматривают: dosikus_2


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

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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB