TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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.
-
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
-
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.
-
i got it, Gracias.