Atribuir valor máximo de número inteiro menor a um número inteiro maior
-
28-09-2019 - |
Pergunta
Considere o seguinte código:
uint32_t x = ~uint8_t(0);
std::cout << x << std::endl;
Agora, eu esperava que isso tenha saído 255
, mas em vez disso, produziu 4294967295
.
Estou ciente da promoção inteira em C ++, mas não consigo entender por que isso aconteceria. A maneira como eu entendo, a expressão ~uint8_t(0)
deve avaliar 1111 1111
em binário. o ~
O operador fará com que o tipo seja promovido a um int
(que vou assumir é de 32 bits para fins de discussão), estendendo o valor a 0000 0000 0000 0000 0000 0000 1111 1111
. Este valor promovido deve ser atribuído ao LValue x
, resultando em x == 255
.
Mas obviamente não estou entendendo isso corretamente. o que estou perdendo?
Solução
As promoções integrais são realizadas no operando do unário ~
, então o uint8_t(0)
é promovido a int
e então o ~
é avaliado. É equivalente a
~(int)(uint8_t)0
Você pode obter o valor máximo representável por um tipo usando std::numeric_limits<T>::max()
; Se o tipo não estiver assinado, você também pode lançar -1
para esse tipo:
uint32_t x = (uint8_t)-1;
Outras dicas
No seu exemplo, o operador não bitwise (~
) está promovendo seu operando para um int
antes de executar. Isso é então convertido em um unsigned int
pela tarefa.
Aqui estão algumas amostras de código relacionadas que deixam isso mais claro:
uint8_t y = ~uint8_t(0);
uint32_t x = y;
std::cout << x << std::endl;
255
uint8_t y = uint8_t(0);
int z = ~y;
uint32_t x = z;
std::cout << x << std::endl;
4294967295