Pregunta

Podría alguien explicarme por qué la máscara no se desplaza a la derecha del todo? Se puede utilizar cualquier cosa en lugar de que el 1 y el resultado será el mismo.

unsigned mask = ~0 >> 1;
printf("%u\n", mask);
¿Fue útil?

Solución

Es una cuestión de tipo. Si lanzas el 0 a sin firmar no habrá ningún problema:

unsigned mask = ~ (unsigned) 0 >> 1;
printf("%u\n", mask);

Editar por los comentarios: o el uso de la notación literal sin signo, que es mucho más breve. :)

unsigned mask = ~0u >> 1;
printf("%u\n", mask);

Otros consejos

Inscripción extensión

Lo que pasa es ~0 es un entero con todos los bits (-1). Ahora desplazamiento a la derecha por 1; ya que es -1, extensión de signo mantiene el bit más alta establecida de modo que quedó firmado (esto no es lo que se esperaba). Entonces se convierte en sin firmar como usted espera.

Prueba esto:

unsigned mask = (unsigned) ~0 >> 1;
printf("%08x\n", mask);

El lado derecho de la asignación se trata como una cantidad firmado menos lo lanzas, lo que significa que estaban viendo extensión de signo sin el molde. (También ha cambiado su estado de impresión para mostrar el número en hexadecimal, que es más fácil para mí para decodificar.)

~ 0 es una cadena de unos. El operador >> ellas cambia, y en un valor con signo, desplaza los bits de orden en los más altos. Por lo que puede cambiar todo lo que quiera, el resultado no va a cambiar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top