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
¿Fue útil?

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.

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