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.

Foi útil?

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top