TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: donvalles en 07 de Agosto de 2014, 11:25:47

Título: Pregunta Básica - Operaciones int16 to char int32 to char
Publicado por: donvalles en 07 de Agosto de 2014, 11:25:47
Hola, Voy a hacerles una pregunta básica, cuando hago en el pic con ccs las siguentes operaciones:

int16 i16_A=0x1234;
unsigned char u8_Variable;

u8_Variable=char (i16_A & 0xFF); //tomo el LSB

//ahora variable=0x34

Para este caso colocar el char delante de la operción significa que toma el LSB de la variable de 16bit


otro ejemplo
int32 i32_B=0x12345678;
int16 i16_A;

i16_A= int16( i32_B & 0xFFFF);

//Ahora i16_A=0x5678 , o sea toma los dos ultimos bytes;


Estas operciones son correctas?
Colocar el el tipo de operador char o int16 delante de la opercion a realizar se utilizan para otras operaciones o asignaciones?

Gracias.
Título: Re: Pregunta Básica - Operaciones int16 to char int32 to char
Publicado por: elmasvital en 07 de Agosto de 2014, 14:36:35
char ( )  o int16 ()(char) o (int16) o cualquier tipo de dato valido delante de la expresión transformara el número en el nuevo tipo perdiendo precisión o ganandola segun el caso.

Pero dentro de los parentesis se lleva a cabo una operación que tiene preferencia que es i16_A & 0xFF

i16_A & 0xFF lo que hace es una máscara binaria and. En este caso sirve para borrar los 8 bits más significativos. esta haciendo la siguiente operación

i16_A= 1234 en binario 0000010011010010
0xff = 256    en binario 0000000011111111

el resultado sería 000000011010010

La tabla de verdad de And dice que solo donde hay 1 & 1 = 0 el resto de posibilidades es 0. Con esta operación consigue quedarse con los 8 bits menos significativos


Una vez hecha esta operación se transforma a 8 bits con el (char)(0b000000011010010)=11010010;


En definitiva lo que hace esa operación es evitar transformar un numero mayor al tipo a convertir. No tengo claro si (char) i16_A directamente daría fallo por tener un valor mayor a 256. Pruebalo.

Saludos

Edito:Corrijo por las puntualizaciones de bruno
Título: Re: Pregunta Básica - Operaciones int16 to char int32 to char
Publicado por: BrunoF en 07 de Agosto de 2014, 14:40:28
Hola,

hacer (tipo) es lo que se llama: CASTING. Y es explicitarle al compilador a qué tipo de variable deseamos convertir la expresión ubicada a la derecha.

En CCS no hace falta para los ejemplos que diste explicitar nada, ni siquiera las máscaras.

u8_Variable = i16_A; //tomo el LSB

y

i16_A= i32_B;

respectivamente, generarían el mísmo comportamiento que con los CAST y máscaras. Si la variable a convertir es mayor en tamaño que la variable destino, se recorta siempre la parte alta de la variable que no cabe.

Igualmente el casting se realiza mediante (tipo) expresión o (tipo) (expresión) y no mediante tipo (expresión) (nótese la diferencia de los paréntesis)

Saludos.


Título: Re: Pregunta Básica - Operaciones int16 to char int32 to char
Publicado por: donvalles en 08 de Agosto de 2014, 08:07:59
i got it, Gracias.