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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top