Я не уверен, когда мне приходится беспокоиться о переполнениях при использовании неподписанных символов. Этот случай ясно:Операции uint8_t, когда они переполняются?
uint8_t a = 3;
uint8_t b = 6;
uint8_t c = a - b; // c is 253
Однако то, что происходит здесь:
float d = a - b; // d is -3
ли одновременно и быть преобразованы, чтобы плавать, прежде чем делать вычитание?
Или же в этом случае:
float e = (a - b) + (a - c);
ли все три переменные преобразуются плавать?
Возможны ли случаи, когда может произойти переполнение, даже если назначаемая переменная является поплавком? Являются ли правила одинаковыми, если e - это float, или int, или что-нибудь еще?
Кроме того, что происходит в таком случае, как это:
int a = std::abs(a - b);
неподписанных операции никогда не переполнение, они просто обернуть вокруг. 'uint8_t c = a - b;' означает 'uint8_t c = (uint8_t) ((int) a - (int) b);' который создает завернутый результат после отливки –
Чтобы добавить комментарий @ LưuVĩnhPhúc, переполнение плохо, очень плохо. Это неопределенное поведение. Целочисленные целые числа никогда не переполняются. Вместо этого они используют арифметику по модулю 2^n. –
Также см. [Почему коротко преобразовать в int перед арифметическими операциями в C и C++?] (Http://stackoverflow.com/q/24371868/1708801) –