En C desplazamiento a la izquierda (char) 0xFF por 8 y echarlo a int
Pregunta
El desplazamiento a la izquierda de (char) 0xff por 8 y echándola a int obtenemos -256 o 0xffffff00. ¿Puede alguien explicar por qué esto sucede?
#include <stdio.h>
int main (void)
{
char c = 0xff;
printf("%d %x\n", (int)(c<<8),(int)(c<<8));
return 0;
}
salida es
-256 ffffff00
Solución
char
puede ser con o sin signo - es definido por la implementación. ¿Ves estos resultados porque char
está firmada por defecto en su compilador.
Para el carbón firmado 0xFF corresponde a -1 (que es como de dos trabajan complemento). Cuando intenta cambiar lo que se promueve a una primera int
y luego se movió -. Se obtiene de manera efectiva la multiplicación por 256
Por lo que es este código:
char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf( "%d, %x", shifted, shifted );
Otros consejos
Cuando vi por primera vez el problema, mi vista inicial era que el carbón 'c' debe ser desplazada izquierda 8 bits -. Todos los 8 bits de ser desechado, el carbón vacía, entonces se convierte en una int de valor 0
Un poco de investigación revela Conversiones unarios habituales - aquí es donde para reducir el gran número de tipos aritméticos, las conversiones se aplican automáticamente a operandos de la unario, '!' '-', '~ 'y '' operadores, y para cada uno de los operandos de la binario '* <<' y '>> operadores'.
Por lo tanto el carbón 'c' se convierte en un int primero y, a continuación desplazado a la izquierda, dando la respuesta que se ve.
Se aprende algo nuevo todos los días!
c está siendo promovido a un int antes de realizar la operación de cambio. Asumiendo que su aplicación hace que caracteres firmados por defecto, esto significa que usted va a conseguir 0xffffffff, que luego se desplaza a la izquierda para dar el resultado.
Si haces c en un unsigned char, usted debe conseguir lo que espera.
char es nada más que signed char. Así de char c = 0xFF será -1. Cuando desplazamiento a la izquierda -1 por 8 bits se obtiene -256.