Добавление двух беззнаковых переменных char и результата int

Есть код:

#include <iostream>
int main(){
  unsigned char a = 4, b = 255;
  int g = (unsigned char)a + (unsigned char)b;
  std::cout << g << std::endl;
  return 0;
}

Результат:

259

Почему результат 259, а не 3? Если добавлены две беззнаковые переменные char, должно быть переполнение, результат должен быть 3, а затем он должен преобразовать из unsigned char 3 в int 3.

Ответ 1

Операция добавления сначала продвигает свои операнды до int, прежде чем делать добавление. Вот как работает C. Если вы хотите усечь, вам нужно назначить его обратно в более узкий тип, например unsigned char.

Ответ 2

Целочисленная арифметика никогда не выполняется для типов данных, меньших, чем int. Например, для типов, меньших, чем int, например. если добавляются два типа char и short int, они повышаются до int до любой арифметической операции и результат является целым типом. Если один из типов оказался больше, чем int, например, long long int и int, тогда int получает значение long long int, а результат long long int.

(§ 4.5/1) - значение типа char, подписанное char, unsigned char, short int или unsigned short     int может быть преобразован в rvalue типа int, если int может представлять все значения типа источника; в противном случае значение r источника может быть преобразуется в rvalue типа unsigned int.