Pregunta

Tengo números firmados (complemento a 2) almacenados en enteros de 32 bits, y quiero extraer campos de 16 bits de ellos. ¿Es cierto que si extraigo los 16 bits bajos de un número con signo de 32 bits, el resultado será correcto siempre que el número original (32 bits) se ajuste a 16 bits?

Para los números positivos es trivialmente cierto, y parece que también para los negativos. Pero, ¿se puede probar?

Gracias de antemano

¿Fue útil?

Solución

Sí, en el complemento de dos, los bits de signo se extienden " hasta el final " a la izquierda. Cuando lanzas un corto firmado a un int firmado, el número es " signo extendido " y tiene el mismo valor.

Ejemplo: Nibble (-2) = 1110 = > Byte (-2) = 1111_1110

Obviamente lo contrario también es cierto, si captura al menos un bit de signo, entonces el valor del número no cambia.

Otros consejos

Desde mi (segunda) lectura de su pregunta, no parece que necesite " extraer " ¿Algún bit, pero más bien convertir el número entero?

I.e. hacer algo como esto:

int negative = -4711;
short x = (short) negative;

En este caso, el compilador se asegurará de que la precisión del número original se convierta en la asignación. Este sería el caso incluso si el hardware subyacente no estuviera utilizando el complemento 2: s. Si es así, es probable que esto sea solo un truncamiento, como lo explica Motti.

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