В gcc добавление или вычитание константы к целочисленному типу, меньшему чем int
приводит к int
,
#include <cstdint>
#include <cstdio>
int main()
{
int8_t wat = 5;
printf("%zd\n", sizeof(wat + 1));
return 0;
}
дает 4. Я заметил это при использовании простого +=
заявление с -Wconversion
, С этим установленным флагом предупреждения
#include <cstdint>
int main()
{
int8_t wat = 5;
wat += 5;
return 0;
}
дает
wat.cpp: 7: 6: предупреждение: преобразование в «int8_t {также известный как char}} из« int »может изменить его значение [-Wconversion]
Есть ли способ подавить это предупреждение? Почему это происходит? Кастинг, похоже, не помогает.
Согласно стандарту C ++
10 Многие бинарные операторы, которые ожидают операнды арифметики или
Тип перечисления вызывает преобразования и приводит к типам результата в аналогичном
путь. Цель состоит в том, чтобы получить общий тип, который также является типом
результат. Эта модель называется обычными арифметическими преобразованиями,
Обычное арифметическое преобразование включает в себя интегральное продвижение
1 Значение типа integer, отличное от bool, char16_t, char32_t или
wchar_t, чей ранг преобразования целых чисел (4.13) меньше, чем ранг
int может быть преобразовано в значение типа int, если int может представлять все
значения типа источника; в противном случае исходное значение может быть
преобразуется в значение типа unsigned int.
Так что в этом выражении
wat += 5;
это эквивалентно
wat = wat + 5;
wat
в правой части задания преобразуется в тип int
и тип выражения wat + 5
это инт. Как диапазон значений типа int
больше, чем типа int8_t
Компилятор выдает предупреждение.
Также в сообщении с предупреждением показано, как подавить предупреждение: [-Wconversion]