resultados inesperados bitshift
Pergunta
Estou inicializar um short int não assinado com a = 0xff (todos os bits são set). Em seguida, atribuo a um b >> 7 os quais devem produzir (0000 0001) e que o faz. No entanto, a coisa estranha é que quando eu atribuir c a um << 7, não é equivalente a (1000 0000). Eu testei este emitindo 0x80 (que é 1000 0000) e c, mas eles não são os mesmos.
Aqui está um código:
unsigned short int a = 0xff;
unsigned short int b = a>>7;
unsigned short int c = a<<7; // c should == 0x80
Eu não tenho certeza qual é o problema. Qualquer ajuda é apreciada. Obrigado.
P.S. Por I 0x80 saída média "output" e c na forma decimal e hex.
Solução
a curto int tem 16, e não apenas 8 bits.
Então você provavelmente vai obter "0111 1111 1000 0000" como o resultado de 0xff << 7.
Outras dicas
Não adivinhar tipos de bits, o uso <stdint.h>
A short int "normalmente" tem 16 bits. Na verdade, eu tenho certeza que sempre tem 16 exceto para os computadores de Marte, mas isso não é algo que as promessas padrão.
Se você quiser declarar tipos que têm um número específico de bits, a técnica de conformidade é:
#include <stdint.h>
int8_t a;
uint8_t b;
int16_t x;
uint16_t y;
Isso teria evitado o seu palpite não-completamente-direita na representação do short
bit. Por alguma razão, a Microsoft está muito longe de conformidade com o padrão C99, mesmo em coisas fáceis como <stdint.h>
. Felizmente, um projeto mantém um VC ++ versão stdint .
Eu esperaria que você tem 0x7f80. Acho que o que você quis escrever é:
unsigned short int c =
b
<<7; // c should == 0x80
Infelizmente, VC ++ (o compilador C) não tem inttypes.h porque não suporta totalmente C99. Você tem que usar cabeçalhos 3-parte (por exemplo stdint.h de Paul Hsieh).
Se você quiser obter esse resultado, você pode cortar a maior parte a << 7
do que o 8º menos significativo-bit, usando bit a bit-e:
unsigned short int c = (a << 7) & 0xff;