Почему добавление константы в int8_t продвигает ее в больший тип?

В 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]

Есть ли способ подавить это предупреждение? Почему это происходит? Кастинг, похоже, не помогает.

2

Решение

Согласно стандарту 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]

1

Другие решения


По вопросам рекламы [email protected]