Почему компилятор не дает ошибку, когда значение со знаком присвоено целому числу без знака? - C++

Не видя полной грамматики, я думаю, что ваша проблема заключается в отсутствии токена EOF в вашем основном правиле. ANTLR4 потребляет столько данных, сколько может, но если он не соответствует чему-либо хотя бы в основном правиле, он игнорирует остальное, что объясняет, почему вы не видите ошибку. Добавляя EOF, вы сообщаете вашему ANTLR4, что все входные данные должны совпадать:

calc: choice INTEGER INTEGER EOF;
17
задан Navaneeth K N 19 April 2009 в 17:03
поделиться

4 ответа

Microsoft Visual C ++:

предупреждение C4245: «инициализация»: преобразование из int в unsigned int ', несоответствие со знаком / без знака

На уровне предупреждения 4.

G ++

Дает мне предупреждение:

предупреждение: преобразование отрицательного значения -0x00000000a 'до unsigned int'

Без каких-либо директив -W.

GCC

Вы должны использовать:

gcc main.c -Wconverver

, который выдаст предупреждение :

предупреждение: отрицательное целое число неявно преобразуется в тип без знака

Обратите внимание, что -Wall не включит это предупреждение.


Возможно, вам просто нужно увеличить уровни предупреждений.

16
ответ дан 30 November 2019 в 12:20
поделиться

For gcc compiler you can add

gcc -Wconversion ...

And this will produce the following warning

warning: converting negative value '-0x0000000000000000a' to 'unsigned int'
1
ответ дан 30 November 2019 в 12:20
поделиться

Преобразование со знаком int в без знака int является чем-то известным в стандарт C как «обычное арифметическое преобразование», так что это не ошибка.

Причина, по которой компиляторы часто не выдают предупреждение об этом по умолчанию, заключается в том, что это так часто делается в коде, что было бы слишком много «ложных» Позитивные предупреждения вынесены в целом. Существует огромное количество кода, который работает со значениями со знаком int и работает с вещами, которые по своей природе не имеют знака (например, для расчета размеров буфера). Также очень часто смешивать значения со знаком и без знака в выражениях.

Это не значит, что эти тихие преобразования не несут ответственности за ошибки. Таким образом, может быть неплохо включить предупреждение для нового кода, чтобы s "чистый" с самого начала. Тем не менее, я думаю, что вы, вероятно, сочтете довольно трудным иметь дело с предупреждениями, выданными существующим кодом.

13
ответ дан 30 November 2019 в 12:20
поделиться

-10 анализируется как целочисленное значение, и присваивание int для unsigned int разрешено. Чтобы узнать, что вы делаете что-то не так, компилятор должен проверить, является ли ваше целое число (-10) отрицательным или положительным. Поскольку это больше, чем проверка типов, я думаю, что она была отключена из-за проблем с производительностью.

2
ответ дан 30 November 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: