C++ auto on int16_t casts to integer
The problem isn't with auto
here. When you subtract two int16_t
values, the result is an int
. We can demonstrate it with this code here:
#include <iostream>
#include <cstdint>
using namespace std;
template<class T>
void print_type(T) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
int main() {
int16_t a = 10;
int16_t b = 20;
print_type(a);
print_type(b);
print_type(a - b);
return 0;
}
a
and b
are both short int
s, but when you add or subtract them it produces a regular int
. This is to help prevent overflow / and is also for backwards compatibility.
This phenomenon is called the usual arithmetic conversions. It is defined in the C and C++ standards and (roughly said) converts anything smaller than an int
to an int
. It converts larger types as well. Take some time and read about it, you'll need it quite often.