TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: cucu 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
-
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. :)
-
¿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
-
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
-
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.
-
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
-
Mil disculpas, prometo no volver a desayunar con Wisky... :oops: :oops: :oops:
-
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
-
jeje Hola
¿Qué tal así?
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...
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.
-
Genial!!! funciona justo como quería. Muchas gracias. Saludos