Ответ 1
Операция добавления сначала продвигает свои операнды до int
, прежде чем делать добавление. Вот как работает C. Если вы хотите усечь, вам нужно назначить его обратно в более узкий тип, например unsigned char
.
Есть код:
#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.
Операция добавления сначала продвигает свои операнды до int
, прежде чем делать добавление. Вот как работает C. Если вы хотите усечь, вам нужно назначить его обратно в более узкий тип, например unsigned char
.
Целочисленная арифметика никогда не выполняется для типов данных, меньших, чем 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.