Ho il seguente pezzo di codice:sottrazione di due unsigned dà firmato
#include <cstdint>
template <typename T>
T test(T a, T b)
{
float aabb = reinterpret_cast<float>(a - b);
}
int main(int argc, const char *argv[])
{
std::uint8_t a8, b8;
test(a8, b8);
return 0;
}
So che il reinterpret_cast<float>
non può funzionare e che dà un errore in fase di compilazione. Sto usando quell'errore in modo che il compilatore mi dica il tipo di a - b
.
Il problema è che in questo caso, si dice che il tipo di a - b
è int
quando entrambi sono uint8_t (unsigned char)
. Lo stesso accade con uint16_t
. Ma non con uint32_t
che dice che a - b
è unsigned int
.
Quindi, la mia domanda è: è questo comportamento previsto (che il char senza segno - unsigned char fornisce un int), o si tratta di un qualche tipo di strano bug del compilatore (testato sia con GCC che con clang)?
Questo sembra [rilevante] (http://stackoverflow.com/questions/29817927/why-are-integer-types-promoted-during-addition-in-c?rq=1) (la promozione è almeno simile in C e C++, se non uguale). – chris
Sì, qualsiasi tipo più piccolo di 'int' promuove a' int' per l'aritmetica. – ShadowRanger
Evita anche 'reinterpret_cast', è definito dall'implementazione. – vsoftco