Autor Tema: PrintChar  (Leído 2241 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
PrintChar
« en: 17 de Noviembre de 2008, 07:11:24 »
hola, quiero imprimir una variable de tipo int en hexadecimal con las funciones de Console.h, casi todas las funciones aceptan como parámetros una  variable de tipo BYTE, la que mejor se adapta a mi funcionamiento es:

void PrintChar(BYTE);

Tengo:

int entero = 0x1234;
entonces, según creo sería:

BYTE alto;
BYTE bajo;

   alto = (BYTE)(entero>>8) && 0xff;
   bajo = (BYTE) entero && 0xff;
   PrintChar(alto);
   PrintChar(bajo);

pero siempre me almacena 0101, no se porque, he probado sin (BYTE) también y nada, lo mismo, también con tipo char. ¿alguien sabe que hago mal? Gracias

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: PrintChar
« Respuesta #1 en: 17 de Noviembre de 2008, 09:18:25 »
Un Byte son 4 bits.
Un entero INT son dos Bytes u ocho bits.
Hasta ahi bien.

Luego le asignas el valor 0x1234 que equivale en decimal a 4660 y en binario a 1001000110100.

Cuando asignas por casting el valor, lo haces con una mascara de (0xff) en vez de (0x0f) que es la que deberias usar.

Creo que estas confundido con el alcance numerico de las variables, debes revisar eso. :)
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: PrintChar
« Respuesta #2 en: 17 de Noviembre de 2008, 10:35:19 »
¿Un BYTE son 4 bits? vaya... nunca lo habría pensado... si que estaba confundida entonces, pero, ¿por qué si pongo:

char prueba = 0x23;

printChar(prueba);

 funciona?

De todos he probado con 4 bits y tampoco funciona.

Gracias. Saludos

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: PrintChar
« Respuesta #3 en: 17 de Noviembre de 2008, 10:52:29 »
Otra cosa, de algo de lo que sí estoy totalmente segura (además lo acabo de confirmar) es que un entero son 16 bits y no 8. ¿estás seguro de que un BYTE son 4 bits?

Saludos

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: PrintChar
« Respuesta #4 en: 17 de Noviembre de 2008, 10:58:43 »
Un Byte son 4 bits.

 :shock: :shock: :shock: :shock: :shock:

Mis bytes son de 8 bits, creo. ¿o no?

 :shock: :shock: :shock: :shock: :shock:

Cuando hablo de 4 bits me refiero a Nibles no de Bytes.

 :shock: :shock: :shock: :shock: :shock:

Lo que puede ser es que un int dependiendo del compilador sean 8 o 16 bits o un long sean 16 o 32 bits ... por eso yo en mis programas uso int8, int16 o int32 para los enteros y asi siempre saber con qué estoy trabajando.
« Última modificación: 17 de Noviembre de 2008, 11:01:39 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: PrintChar
« Respuesta #5 en: 17 de Noviembre de 2008, 10:58:52 »
Hola.

Depende del compilador. byte en CCS es un unsigned char e int es un int8, en C18 no recuerdo que halla byte pero int si es un int16.

Saludos
El papel lo aguanta todo

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: PrintChar
« Respuesta #6 en: 17 de Noviembre de 2008, 11:12:54 »
Mil disculpas, prometo no volver a desayunar con Wisky... :oops: :oops: :oops:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: PrintChar
« Respuesta #7 en: 17 de Noviembre de 2008, 11:17:26 »
jajaaj...

Bueno yo también me he liado un poco, lo que quiero es transformar una variable de tipo WORD (de 16 bits) en dos de tipo BYTE (de 8), y al revés también, dos BYTE en un WORD:

WORD palabra = 0x1234; -> quiero que me de dos resultados 0x12 y 0x34

BYTE inferior = 0x56;
BYTE superior = 0x78; -> esto tiene que darme un único resultado 0x5678

No consigo hacerlo de ninguna manera, y no debería ser tan dificil... no se... ¿alguna idea? Gracias

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: PrintChar
« Respuesta #8 en: 17 de Noviembre de 2008, 12:39:30 »
jeje Hola

¿Qué tal así?

Código: [Seleccionar]

int entero = 0x1234;

PrintChar((unsigned char)entero); //imprime byte menos significativo
PrintChar((unsigned char)entero>>8); //imprime byte más significativo


El casting (unsigned char) trunca los 16 bits para crear un char sin signo. Para el byte más significativo solo se rota la palabra 8 veces a la derecha borrando el byte menos significativo y dejando el más significativo listo para ser convertido a char.

Edito: no había leído bien que querías juntar dos bytes en un int, así lo haría yo...

Código: [Seleccionar]
Byte alto=0x56;
Byte bajo=0x78;
int nuevoentero;

nuevoentero= (int) (alto<<8) | (bajo);

Toma el byte alto y lo recorre 8 veces a la izquierda dejándolo en el byte más significativo de int. Luego se le "suman" los bits del byte bajo con una operación OR y el int queda armado.
« Última modificación: 17 de Noviembre de 2008, 13:00:16 por migsantiago »

Desconectado cucu

  • PIC12
  • **
  • Mensajes: 74
Re: PrintChar
« Respuesta #9 en: 18 de Noviembre de 2008, 05:38:44 »
Genial!!! funciona justo como quería. Muchas gracias. Saludos