Jump to content
bigfriend

[Resolvido] converção de dec para hex

Recommended Posts

bigfriend

Boa noite

Estou com um pequeno problema aqui a desenvolver uma funçao para converter um numero de base 10 para base 16.

Eu ja consegui fazer a converção de uma base para a outra, o mal é que tenho que dividir o nº a meio,ou seja, tenho que por os dois primeiros bytes numa variável e os outro dois noutra.

o codigo que tenho e o seguinte

char convertdechex(int calcular_TMR)
{
 int dec,i;
 char hex[5]="axxxxx";
 de=calcular_TMR;
 for(i=2;n<16;i++)
 {
   hex[i]=n%16;
   n=n/16;
 }
 for(i=2;i<=0;i++)
 {
   if(r[i]==10)
     r[i]="A";
   else if(r[i]==11)
     r[i]="B";
   else if(r[i]==12)
     r[i]="C";
   else if(r[i]==13)
     r[i]="D";
   else if(r[i]==14)
     r[i]="E";
   else if(r[i]==15)
     r[i]="F";
 }
 return hex
}

Alguém me pode dizer se isto esta bem e como posso fazer a parte que me falta?

Cumprimentos

Bigfriend

Edited by Rui Carlos
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

qual o problema em usar ?

char n16[8];
int n10 = 10123;
itoa(n10, n16, 16);      // se o teu compilador aceitar
sprintf(n16, "%x", n10); // alternativa


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
bigfriend

Desde ja agradeço a ajuda

a função itoa faz automaticamente a conversão?

o outro problema que tenho e o seguinte

faz de conta que fica

n16=0x12FA

agora preciso de passar isto para o seguinte

TMR0L=0xFA

TMR0H=0x12

como e que posso fazer esta divisão.

Esta divisão tem de ser feita porque isto será para utilizar num micro controlador PIC18F para config um TIMER.

Cumprimentos

Bigfriend

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu considero que o uso de macro aqui é facílimo:

#include <stdio.h>

#define BYTEN(a, n) ((a >> (n*8)) & 0xFF)

#define BYTE0(a) BYTEN(a,0)
#define BYTE1(a) BYTEN(a,1)
#define BYTE2(a) BYTEN(a,2)
#define BYTE3(a) BYTEN(a,3)

int main(void) {
 unsigned int a = 4858; // 0x12fa

 int TMR0L = BYTE0(a);
 int TMR0H = BYTE1(a);

 char hexLB[8], hexHB[8];

 sprintf(hexLB, "%x", TMR0L);
 sprintf(hexHB, "%x", TMR0H);

 printf("valor inicial : %d >> %x\n", a, a);

 printf("low byte : %d >> %x\n", TMR0L, TMR0L);
 printf("high byte : %d >> %x\n", TMR0H, TMR0H);

 printf("conversao para string low byte : %s\n", hexLB);
 printf("conversao para string high byte : %s\n", hexHB);

 return 0;
}

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
pmg

char convertdechex(int calcular_TMR)
{
 char hex[5]="axxxxx";
 /* ... */
 return hex;
}

Isto está muito mal!

Não podes devolver uma variável local.

Além disso o tipo de hex (char[5]) e o tipo do valor devolvido pela função (char) não são compativeis.


Tens que distinguir entre valor e representação. As representações "23", "0x17", "b00011011", "twenty three", "vinte e três" são todas válidas para o mesmo valor. A representação interna dum valor para um computador não altera o valor.

Tu não precisas de strings (representações de valores); apenas precisas de valores.

Por exemplo o valor 4858 é o mesmo que o valor 4*10^3 + 8*10^2 + 5*10^1 + 8*10^0 que é o mesmo que o valor 1*16^3 + 2*16^2 + 15*16^1 + 10*16^0 ou 18*256^1 + 250*256^0.

Só precisas dos operadores de divisão e módulo.

Edited by pmg
  • Vote 1

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
bigfriend

Por o que encontrei na libraria do PIC18 o TMR0L e o TMR0H são do seguinte tipo

unsigned char	   TMR0L;
unsigned char	   TMR0H;

Sendo do tipo char posso fazer dessa forma?

Cumprimentos

Bigfriend

Share this post


Link to post
Share on other sites
pmg

Sendo do tipo char posso fazer dessa forma?

O tipo unsigned char é um tipo normal, com um range pequenito (é comum o range ser de 0 a 255). Tirando essa coisa do range, podes fazer com um unsigned char tudo o que fazes com um unsigned int (ou um int, sem contar com valores negativos).


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
HappyHippyHippo

são desse tipo por causa de duas razões :

- são 8 bits (1 byte)

- o bit mais significativo do grupo (o da esquerda) não será avaliado como sinal do valor

e sim, podes muito bem usar esse tipo de dados no código que te dei


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
bigfriend

obrigado pessoal

parece que vai funcionar.

Cumprimentos

BigFriend

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.