Asignación de valor máximo de número entero más pequeño a un número entero mayor

StackOverflow https://stackoverflow.com/questions/4073616

  •  28-09-2019
  •  | 
  •  

Pregunta

Considere el siguiente código:

 uint32_t x = ~uint8_t(0);
 std::cout << x << std::endl;

Ahora, espera plenamente que esto 255 de salida, pero en cambio 4294967295 salida.

Estoy al tanto de la promoción número entero en C ++, pero no puedo entender por qué esto iba a pasar. La manera en que yo entiendo, la expresión ~uint8_t(0) debe evaluar a 1111 1111 en binario. El operador ~ hará entonces que el tipo para ser promovido a un int (que voy a asumir es de 32 bits por el bien de la discusión), por signo extiende el valor a 0000 0000 0000 0000 0000 0000 1111 1111. Este valor debe entonces ser promovido asignado a la x lvalue, lo que resulta en x == 255.

Pero, obviamente, no estoy entendiendo esto correctamente. ¿Qué me falta?

¿Fue útil?

Solución

Las promociones integrales se llevan a cabo en el operando de la ~ unario, por lo que el uint8_t(0) es ascendido a int y luego se evalúa la ~. Es equivalente a

~(int)(uint8_t)0

Usted puede obtener el valor máximo representable por un tipo usando std::numeric_limits<T>::max(); si no está firmado el tipo, también puede emitir -1 a ese tipo:

uint32_t x = (uint8_t)-1;

Otros consejos

En el ejemplo, el bit a bit no operador (~) está promoviendo su operando a una int antes de ejecutar. A continuación, esta se convierte en un unsigned int por la asignación.

Estos son algunos ejemplos de código relacionados que hacen esto más 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top