Página 1 de 1

16bits para 8bits

MensagemEnviado: 16 Dez 2009 10:12
por Blew
Olá pessoal,
Alguem tem uma ideia rapida para transformar uma variavel de 16bits para 2 de 8bits em C?
Obrigado...

Re: 16bits para 8bits

MensagemEnviado: 16 Dez 2009 10:15
por fabim
Blew escreveu:Olá pessoal,
Alguem tem uma ideia rapida para transformar uma variavel de 16bits para 2 de 8bits em C?
Obrigado...


http://www.asm51.eng.br/phpbb/viewtopic ... ght=makros

MensagemEnviado: 16 Dez 2009 10:18
por Sergio38br
Código: Selecionar todos
int16_t v1;
int8_t v2;
int8_t v3;

v2 = v1 & 0xff;
v3 = (v1 >> 8);

Ajuda??

[ ]'s
Sergio

MensagemEnviado: 16 Dez 2009 10:24
por Blew
>> isso quer dizer que vc está rotacionando o byte 8 vezes?
e qual a função de &0xff?

MensagemEnviado: 16 Dez 2009 10:43
por fabim
#define lo(param) ((short *)&param)[0]
#define hi(param) ((short *)&param)[1]

unsigned int inteiro16;
unsigned char bytelow, bytehigh, *ponteiro;

bytelow = lo(inteiro16);
bytehigh = hi(inteiro16);

ou.

bytelow = ((short *)&inteiro16)[0];
bytehigh = ((short *)&inteiro16)[1];

ou;
ponteiro = &inteiro16;

bytelow = *ponteiro++;
bytehigh = *ponteiro;

ou:

bytelow = inteiro16%256;
bytehigh = inteiro16/256;

ou:

ou:

ou:


e por aí vai, basta escolher..

o primeiro comando usa apenas uma instrução por nible8..

abraços

MensagemEnviado: 16 Dez 2009 13:35
por msamsoniuk
a forma mais recomendavel seria usar um union:

union
{
char b[2];
short w;
} a;

a.w = 32767

printf("%x -> {%x,%x}\n",a.w,a.b[0],a.b[1]);


mas a forma que o fabim falou tambem eh boa, soh fazendo de uma forma diferente:

short w;
char *b = (char *)&w;

w = 32767

printf("%x -> {%x,%x}\n",w,b[0],b[1]);


pois o ponteiro com indice evita a necessidade de se ficar incrementando e decrementando *b :)

MensagemEnviado: 16 Dez 2009 21:43
por aguivone
eu faria assim no ccs:

int aux,aux2;
long variavel=315; //variavel de 16 bits

aux2=variavel;
aux=variavel>>8;

veja que a variavel aux2 pega os 8bits menos significativos
e a variavel aux os 8 mais significativos.

já para fazer duas de 8 e uma de 16
use a função

make16();

MensagemEnviado: 17 Dez 2009 07:15
por fabim
Aquivone, é que como diz o lellis, o CCS é usado apenas por racker´s.
Sendo assim, a maioria do pessoal que tem ant viruz, não consegue usar o CCS nem consegue abrir scripts ou fontes feitos no ccs..

Abraços

MensagemEnviado: 17 Dez 2009 16:24
por aguivone
acho que o modo como coloquei só depende o compilador.

MensagemEnviado: 18 Dez 2009 13:55
por Blew
valeu pelas dicas pessoal...