Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Модератор
 Аватар для Curry
5158 / 3488 / 536
Регистрация: 01.06.2013
Сообщений: 7,576
Записей в блоге: 9

Microchip XC8 C Compiler. Непонятный warning: (751) arithmetic overflow in constant expression

26.01.2018, 20:08. Показов 3375. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В C компиляторах для PIC-ов, кажется после версии 1.40 непонятные предупреждения, например
C
1
2
3
4
#define PROG_VERSION    12345
 
      unsigned char bLow;
      bLow=(unsigned char)(PROG_VERSION & 0xFF);
На последнюю строку ругается warning: (751) arithmetic overflow in constant expression.
Не люблю оставлять предупреждения. С какой стати тут оно? Аналогичный код на других компиляторах (не для пиков) предупреждений не выдаёт. Что изменить что бы предупреждения не было? (Кроме отключения предупреждений, конечно.)

p.s. Это просто развёрнутый макрос LOW_BYTE из pic18.h идущего с этим же компилятором. С макросом, естественно, тоже предупреждение.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.01.2018, 20:08
Ответы с готовыми решениями:

Баг ли это. arithmetic overflow in constant expression
Существует компилятор для микроконтроллеров MPLAB® XC8 C COMPILER. Начиная с некоторой версии он выдаёт предупреждения arithmetic overflow...

Warning C26451: Arithmetic overflow
Кто мне объяснит, почему Visual Studio выдаёт Warning C26451 Arithmetic overflow: Using operator '+' on a 4 byte value and then casting the...

Arithmetic overflow error converting expression to data type int
Добрый день, существует проблема при заполнении таблицы данными запрос: INSERT INTO Users(Surname, Name, Patronymic, Date_of_birth,...

8
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
26.01.2018, 20:14
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
warning: (751) arithmetic overflow in constant expression.
перевод
арифметическое переполнение в постоянном выражении.
нужно оба выражения привести к unsigned char
попробуй
C
1
bLow=((unsigned char)PROG_VERSION & 0xFFU);
0
Модератор
 Аватар для Curry
5158 / 3488 / 536
Регистрация: 01.06.2013
Сообщений: 7,576
Записей в блоге: 9
26.01.2018, 20:37  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
попробуй
то же самое.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
26.01.2018, 21:17
Лучший ответ Сообщение было отмечено KolodeznyDiver как решение

Решение

кажется я понял
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
C
1
#define PROG_VERSION  12345
приводит к char
из за этого и варнинг
попробуй явно объявить её int
или
C
1
const int PROG_VERSION =12345;
или
C
1
#define PROG_VERSION  12345UL
1
Модератор
 Аватар для Curry
5158 / 3488 / 536
Регистрация: 01.06.2013
Сообщений: 7,576
Записей в блоге: 9
26.01.2018, 21:33  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
const int PROG_VERSION =12345;
О! Этот вариант компилируется без предупреждения, хотя в чём разница с явным приведением типа в выражении неясно.
0
1184 / 673 / 113
Регистрация: 15.05.2012
Сообщений: 4,086
27.01.2018, 06:37
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
& 0xFF
Если попробовать 0x00FF? А вдруг?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
27.01.2018, 08:26
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
хотя в чём разница с явным приведением типа в выражении неясно.
вот во что это выражение превращается после препроцессора
C
1
 bLow=(unsigned char)(12345 & 0xFF);
12345 явно не char
попробуй этот вопрос задать в ветке Си( https://www.cyberforum.ru/c/ ) там есть знатоки стандарта и поточней ответят
ну и ссылку сюда, думаю многим интересно будет
0
Модератор
 Аватар для Curry
5158 / 3488 / 536
Регистрация: 01.06.2013
Сообщений: 7,576
Записей в блоге: 9
27.01.2018, 13:48  [ТС]
Цитата Сообщение от pyzhman Посмотреть сообщение
Если попробовать 0x00FF? А вдруг?
Не катит. Предупреждение выдаётся даже в случае
C
1
bLow=(unsigned char)PROG_VERSION;
Цитата Сообщение от ValeryS Посмотреть сообщение
попробуй этот вопрос задать в ветке Си
Задал, хотя, по моему баг. В мануале к компилятору объяснения не нашёл.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
29.01.2018, 12:56
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
О! Этот вариант компилируется без предупреждения
а толку? Эти решения имеют абсолютно разные коды (в общем случае). Хотя, многие советуют не использовать #define, например. С одной стороны, вы можете добавить к const - 'static'. Возможно, компилятор поймет что к чему. Но это не факт - и тогда константа появится с кодом и будет читаться из кода, что совсем не то, что вы предположили.

Пример оч. простой. Если вы используете вычисления с константами (неважно какой сложности), и компилер видит, что они состоят только из цифр и действий - вы получите константу в коде и 1-2 инструкции процессора. Если же компилер не увидит, что код состоит только из констант - он будет вычислять эти константы на рантайме, добавляя килограммы ненужного кода в результирующий бинарник.
Цитата Сообщение от ValeryS Посмотреть сообщение
((unsigned char)PROG_VERSION)
вот так должно работать. Иначе это просто баг.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.01.2018, 12:56
Помогаю со студенческими работами здесь

Arithmetic overflow error converting expression to data type int.
Люди, помогите... есть табличка, там столбец типа int (SQL Server 7 bigint нету), так вот когда суммирую все записи по этому столбцу, то...

как удалить с убунту xc8 compiler
вышла новая версия xc8 и я ее скачал, ноу меня установлена щас старая версия.так вот как ее удалить чтобы новую установить?

Expected constant expression; cannot allocate an array of constant size 0
Доброго утра. Народ помогите, вот программа оформлена в виде функции #include <iostream> #include <iomanip> #include...

OverflowException: Arithmetic operation resulted in an overflow
Прошу совета, эта ошибка вылезла буквально ниоткуда, я не знаю что делать, в интернете толком об этом и не написано. Ошибка появляется при...

Arithmetic overflow error for data type smallint
На экране появляется сообщение Arithmetic overflow error for data type smallint, value=32789 при добавлении записи(строки) из одной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru