Asignación de valor máximo de número entero más pequeño a un número entero mayor
-
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?
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