Na mudança C Esquerda (char) 0xFF por 8 e lançá-lo para int
Pergunta
No deslocamento à esquerda de (char) 0xff por 8 e convertê-lo para int temos -256 ou 0xffffff00. Alguém pode explicar por que isso deve acontecer?
#include <stdio.h>
int main (void)
{
char c = 0xff;
printf("%d %x\n", (int)(c<<8),(int)(c<<8));
return 0;
}
A saída é
-256 ffffff00
Solução
char
pode ser com ou sem sinal - é a implementação-definido. Você vê esses resultados porque char
é assinado por padrão em seu compilador.
Para o caractere 0xFF corresponde assinados a -1 (que é como dois de trabalho complemento). Ao tentar transferi-lo é primeiro promovido a um int
e depois mudou -. Você efetivamente obter a multiplicação por 256
Por isso, é este código:
char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf( "%d, %x", shifted, shifted );
Outras dicas
Quando eu olhei para o problema, minha visão inicial era de que o caractere 'c' deve ser deslocado para a esquerda 8 bits -. Todos os 8 bits sendo descartados, o caractere vazio, então, ser convertido para um int de valor 0
Um pouco de pesquisa revela Conversões Unários usuais - este é o lugar onde a reduzir o grande número de tipos aritméticas, conversões são aplicadas automaticamente para operandos do unário, '!' '-', '~ 'e '*' operadores, e para cada um dos operandos do binário '<<' e '>>' operadores.
Portanto, o char 'c' é convertido para um int início , então deslocada para a esquerda, dando a resposta que você vê.
Você aprende algo novo a cada dia!
c está sendo promovido para um int antes da operação de deslocamento é feito. Supondo que sua implementação faz caracteres assinados por padrão, isso significa que você está indo para obter 0xffffffff, que é então deslocada para a esquerda para dar o seu resultado.
Se você fizer c em um unsigned char, você deve obter o que você espera.
char é nada, mas assinado char. Assim char c = 0xFF será -1. Quando você deixou turno -1 por 8 bits você começa -256.