Вопрос по compiler-warnings, c++, unsigned, variables, compiler-errors – Почему компилятор не выдает ошибку, когда знаковое значение присваивается целому числу без знака? - C ++

16

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

unsigned int a = -10;

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

есть идеи?

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

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

Решение

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

какой компилятор вы используете? jwfearn

Ваш Ответ

5   ответов
-1

чтобы это предупреждение появилось.

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

2

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

1

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

gcc -Wconversion ...

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

warning: converting negative value '-0x0000000000000000a' to 'unsigned int'
13

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

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

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

+1, подробное объяснение. j_random_hacker
16
Microsoft Visual C ++:

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

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

G ++

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

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

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

НКУ

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

gcc main.c -Wconversion

Который даст предупреждение:

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

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

Может быть, вам просто нужно повысить уровень предупреждения.

Ах, ты прав. Я отредактировал свой пост с правильной информацией. Я использовал g ++, потому что он использовал C ++, и оказалось, что g ++ даже не нужен -Wall или -Wconversion. Однако при использовании только GCC вам нужно -Wconversion (не -Wall), как вы предложили. Спасибо :) GManNickG
Просто чтобы заметить, clang использует -Wconversion для выдачи этого предупреждения. gerowam
-Вы не показываете, не так ли? Mykola Golubyev
Да, это проблема. Я повысил уровень предупреждения и теперь получаю предупреждение. Navaneeth K N

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