2009-07-08 6 views

Respuesta

14

char puede estar firmado o sin firmar, su implementación está definida. Verá estos resultados porque char está firmado de forma predeterminada en su compilador.

Para el signo con signo 0xFF corresponde a -1 (así es como funciona el complemento a dos). 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.

Así es este código:

char c = 0xFF; // -1 
int shifted = c << 8; //-256 (-1 * 256) 
printf("%d, %x", shifted, shifted); 
1

char es nada más que signed char. Entonces char c = 0xFF será -1. Cuando saliste del cambio -1 por 8 bits, obtienes -256.

+11

firmado de char es la implementación definida. –

3

c está siendo promovido a un int antes de la la operación de cambio está hecha. Asumiendo que su implementación haga que los caracteres se firmen por defecto, esto significa que obtendrá 0xffffffff, que luego se desplazará a la izquierda para dar su resultado.

Si convierte c en una char sin firmar, debe obtener lo que espera.

7

Cuando miré por primera vez el problema, mi punto de vista inicial era que el carácter "c" debería desplazarse 8 bits a la izquierda; los 8 bits descartados, el carácter vacío se convertiría a un int de valor 0.

Un poco de investigación revela Conversiones unarias habituales - aquí es donde para reducir la gran cantidad de tipos aritméticos, las conversiones se aplican automáticamente a los operandos de los únicos '!', '-', '~' y '*' operadores, y a cada uno de los operandos de los operadores binarios '< <' y '>>'.

Por lo tanto, el carácter 'c' se convierte a int primero, luego se desplaza a la izquierda, dando la respuesta que ve.

¡Aprende algo nuevo todos los días!