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

Я знаю без знака int не может содержать отрицательные значения. Но следующий код компилируется без каких-либо ошибок / предупреждений.

unsigned int a = -10;

Когда я печатаю переменную a , я получаю неверное значение. Если переменные без знака не могут содержать значения со знаком, почему компиляторы позволяют им компилироваться без каких-либо ошибок / предупреждений?

Есть мысли?

Редактировать

Компилятор: VC ++ компилятор

Решение

Нужно использовать уровень предупреждения 4.

Ответы [ 5 ]

16 голосов
/ 19 апреля 2009

Microsoft Visual C ++:

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

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

G ++

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

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

Без директив -W.

1020 * НКУ * Вы должны использовать: gcc main.c -Wconversion Который выдаст предупреждение: предупреждение: отрицательное целое число неявно преобразуется в тип без знака Обратите внимание, что -Wall не включит это предупреждение. Может быть, вам просто нужно повысить уровень предупреждения.

13 голосов
/ 19 апреля 2009

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

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

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

2 голосов
/ 19 апреля 2009

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

1 голос
/ 19 апреля 2009

Для компилятора gcc вы можете добавить

gcc -Wconversion ...

И это выдаст следующее предупреждение

warning: converting negative value '-0x0000000000000000a' to 'unsigned int'
0 голосов
/ 06 июля 2015

Я использую g ++ 4.9.2 и мне нужно использовать -Wsign-преобразование, чтобы это предупреждение появилось.

gcc.gnu.org : Предупреждения о преобразованиях между знаковыми и беззнаковыми целыми числами по умолчанию отключены в C ++, если явно не включена опция -Wsign-translation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...