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

Баг ли это. arithmetic overflow in constant expression

27.01.2018, 13:48. Показов 2615. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Существует компилятор для микроконтроллеров MPLAB® XC8 C COMPILER. Начиная с некоторой версии он выдаёт предупреждения arithmetic overflow in constant expression на такой код (на последнюю строчку)
C
1
2
3
4
#define PROG_VERSION    12345
 
      unsigned char bLow;
      bLow=(unsigned char)(PROG_VERSION & 0xFF);
и даже на такой код
C
1
2
3
4
#define PROG_VERSION    12345
 
      unsigned char bLow;
      bLow=(unsigned char)PROG_VERSION;
но на такой нет
C
1
2
3
4
5
#define PROG_VERSION    12345
 
      unsigned char bLow;
      static const int i = PROG_VERSION;
      bLow=(unsigned char)(i & 0xFF);
На других С компиляторах, например gcc, такого предупреждения не получить.

Как избавится от предупреждения было найдено тут. Интересует соответствие со стандартом С, есть какие то предпосылки выдавать предупреждение, или это следует считать багом компилятора?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.01.2018, 13:48
Ответы с готовыми решениями:

Microchip XC8 C Compiler. Непонятный warning: (751) arithmetic overflow in constant expression
В C компиляторах для PIC-ов, кажется после версии 1.40 непонятные предупреждения, например #define PROG_VERSION 12345 ...

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

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

13
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
29.01.2018, 11:30
Надо смотреть какой тип имеют символические константы в Си. ЕМНИП, int или long в зависимости от того, куда влезет.
А то, что из int в unsigned char будет переполнение это вполне логично. В последнем примере компилятор видимо как-то смог понять, что влазит в диапазон unsigned char.
Бага компилятора точно никакого нет, выдавать предупреждение при переполнении или нет не регламентируется стандартом.
1
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
29.01.2018, 11:52
Цитата Сообщение от MrGluck Посмотреть сообщение
Надо смотреть какой тип имеют символические константы в Си. ЕМНИП, int или long в зависимости от того, куда влезет.
Если вы про макроконстанты, то ЕМНИП int, независимо от того влезет ли. Не даром к ним часто приписывают U, L, LL и т.п. например
#define F_CPU 12000000UL
0
Модератор
 Аватар для Curry
5158 / 3488 / 536
Регистрация: 01.06.2013
Сообщений: 7,576
Записей в блоге: 9
29.01.2018, 16:05  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
А то, что из int в unsigned char будет переполнение это вполне логично.
Вообще то я хотел просто разделить константу на старший и младший байты. Старший байт выделяется без предупреждений, по этому этот код я не привёл. А с младшим вот. Это же вполне корректная операция, результат 12345 & 0xFF влазит в unsigned char.
Цитата Сообщение от MrGluck Посмотреть сообщение
В последнем примере компилятор видимо как-то смог понять, что влазит в диапазон unsigned char.
Да он просто не проверял, т.к. там вместо выражения с числовыми литералами константная "переменная".

p.s. Думаю, всё таки, выдачу этого предупреждения следует отнести к багу, тем более что другие компиляторы тут не предупреждают, хотя это уже флейм философия.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
29.01.2018, 16:07
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если вы про макроконстанты, то ЕМНИП int, независимо от того влезет ли.
ой ли
вот такое имеет место быть
C
1
#define PI 3.1415
явно не инт
define то набор символов и препроцессор впихивает его без всякого контроля
а вот компилятор потом мучается
0
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
29.01.2018, 20:42
ValeryS, он имел в виду целочисленные константы.)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13184 / 6820 / 1821
Регистрация: 18.10.2014
Сообщений: 17,260
29.01.2018, 23:12
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
но на такой нет
Ваш третий вариант не является константным выражением, поэтому и такого предупреждения там нет.

В остальном я никакого оправдания такому поведению компилятора не вижу. Судить об этом с точки зрения стандарта сложно, ибо стандарт не требует никаких диагностических сообщений в этом случае. То есть судя по всему это чистое предупреждение - самодеятельность компилятора.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
30.01.2018, 09:26
Цитата Сообщение от ValeryS Посмотреть сообщение
ой ли
С макросами на самом деле неочевидно. По идее, препроцессор работает только со строками, а арифметика там разве что в #if. В общем, проблемы с дробными числами в макросах все-таки есть, но обычно их можно обойти. С ходу примеров не вспомню.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
30.01.2018, 10:54
Цитата Сообщение от Captain Maxee Посмотреть сообщение
он имел в виду целочисленные константы.)
так define не константа, а макрос
так скажем псевдоним
C
1
#define xxx yyy
там где встретится в тексте xxx он заменится на yyy, а что написано в yyy препроцессор не проверяет все на совести программиста
вот почему в плюсах от define ушли, ну почти что
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13184 / 6820 / 1821
Регистрация: 18.10.2014
Сообщений: 17,260
31.01.2018, 09:52
Цитата Сообщение от ValeryS Посмотреть сообщение
так define не константа, а макрос
так скажем псевдоним
Это верно. Но в языке С других способов привязать имя к константе нет. Только #define или enum, и возможности последнего весьма ограничены.
1
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
31.01.2018, 11:19
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Но в языке С других способов привязать имя к константе нет. Только #define или enum,
А как же const?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
31.01.2018, 13:01
const в некоторых случаях работает неправильно. Вместо прямой подстановки константы в выражение, генерируется год, считающий его в рантайме. С #define таких проблем нет. Конечно, это зависит от конкретного компилятора, но все же.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13184 / 6820 / 1821
Регистрация: 18.10.2014
Сообщений: 17,260
31.01.2018, 16:07
Цитата Сообщение от CoderHuligan Посмотреть сообщение
А как же const?
Модификатор const в языке С (в отличие от С++) не создает константы, он лишь объявляет переменную как "немодифициремую". Выражения с использованием таких значений не являются constant expression в С.
4
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13184 / 6820 / 1821
Регистрация: 18.10.2014
Сообщений: 17,260
01.02.2018, 18:54
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Модификатор const в языке С (в отличие от С++) не создает константы
То есть вот в такой ситуации(-ях), например, const в C вам не поможет

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define N 10
 
int a[N];
 
struct S
{
  unsigned f : N;
};
 
int m = N;
 
int main()
{
  switch (a[0])
  {
    case N:;
  }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.02.2018, 18:54
Помогаю со студенческими работами здесь

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

Arithmetic overflow error converting numeric to date type int
Такая ошибка выдается при попытке занести число 3410600001 в поле, определенное как numeric. Причем только в одной таблице. В другой...

что отзначает [Error] Unit1.pas(59): Overflow in conversion or arithmetic operation
procedure TForm1.Button3Click(Sender: TObject); var a:int64; begin a:=1000000000*3; showmessage(inttostr(i)); end; дает ошибку ...

Ошибка при добалении "Arithmetic overflow or division by zero has occurred"
Добрый день!! insert into...

"Arithmetic operation resulted in an overflow" при переносе функции в dll
Добрый вечер, уважаемые. Наступил на грабли, не могу понять, что делать. Есть вот такой простенький код, он бессмысленный, но...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
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