Easyelectronics.ru • Просмотр темы - IAR long long не работает

Easyelectronics.ru

Электроника для всех
Текущее время: 15 авг 2018, 06:01

Часовой пояс: 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
Сообщения: 565
В общем, написал вот такой рекурсивный фильтр:
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
Сообщения: 601
zhilenkov писал(а):
но если заменить строчку static unsigned int y на static unsigned long long y то фильтр перестает работать.

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


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

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2481
Откуда: Санкт-Петербург
Выглядит как полная херня, откровенно говоря - и 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
Сообщения: 565
aamonster писал(а):
Выглядит как полная херня, откровенно говоря - и long long ни при чём. В строке y=y+(x-m[n]) значение в скобках всегда положительное.
Как так? x - это новое измерение, m[n] массив старых измерений (назовем история измерений). Новое измерение может быть меньше или больше старого. Если новое измерение меньше, то результат в скобках имеет отрицательный знак, если больше положительный. Поэтому все норм.


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

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

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


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

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 196
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
Сообщения: 2481
Откуда: Санкт-Петербург
Более того, уточню: по стандарту C++ (и, кажется, просто C) переполнение беззнакового (в т.ч. вычитание большего из меньшего) ведёт к "заворачиванию" результата (считаем по модулю 65536 для 16-битовых), а для signed - это undefined behaviour. Так что если считать в signed - надо убедиться, что все переменные достаточной длины. А если в unsigned - что переполнение работает ровно так, как вы ожидаете (для случая в теме - проще всего, чтобы x, y и m[n] были одного и того же unsigned типа)


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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