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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top