По моему мнению, для простых операций с 8-битными переменными переменные преобразуются в 32 бит int
с до завершения операции, а затем преобразуются обратно в 8-битные переменные.Почему uint8_t + uint8_t приводит к int?
В качестве примера, это с программой ++:
#include <iostream>
#include <cstdint>
int main(void)
{
uint8_t a = 1;
uint8_t b = 2;
std::cout << "sizeof(a) = " << sizeof(a) << std::endl;
std::cout << "sizeof(b) = " << sizeof(b) << std::endl;
std::cout << "sizeof(a+b) = " << sizeof(a+b) << std::endl;
return 0;
}
Производит следующий вывод:
sizeof(a) = 1
sizeof(b) = 1
sizeof(a+b) = 4
Таким образом, мы могли понять, что происходит, является:
uint8_t c = (uint8_t)((int)(a) + (int)(b));
По-видимому, это похоже, находится в спецификации C, как сказано в форуме this.
Кроме того, в Visual Studio 2013, написание
auto c = a + b;
И наведя указатель мыши на c
указывает, что тип int
.
Вопросов:
- Почему требуется преобразование, почему в спецификации? (Если возможно, с ответом, я бы хотел, чтобы внешние источники информации читали больше по этому вопросу (например, MSDN, cppreference).)
- Как это влияет на производительность?
* "Почему преобразование необходимо, почему это в спецификации?" * – WhiZTiM
Представьте, что вы делаете 'uint8_t а = 200, B = 100, с = 2; uint8_t d = (a + b)/c; 'без поощрения промежуточный результат будет переполняться - с продвижением все заканчивается на 150, который подходит в пункте назначения. –
@JesperJuhl * ".. без продвижения промежуточный результат будет переполняться" * - 'int a = INT_MAX, b = 343232; int c = a + b' все равно будет переполняться ... Итак? – WhiZTiM