Autor Tema: Pregunta Básica - Operaciones int16 to char int32 to char  (Leído 1703 veces)

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

Desconectado donvalles

  • PIC10
  • *
  • Mensajes: 35
Pregunta Básica - Operaciones int16 to char int32 to char
« 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.

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Pregunta Básica - Operaciones int16 to char int32 to char
« Respuesta #1 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
« Última modificación: 07 de Agosto de 2014, 14:44:58 por elmasvital »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Pregunta Básica - Operaciones int16 to char int32 to char
« Respuesta #2 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.


"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado donvalles

  • PIC10
  • *
  • Mensajes: 35
Re: Pregunta Básica - Operaciones int16 to char int32 to char
« Respuesta #3 en: 08 de Agosto de 2014, 08:07:59 »
i got it, Gracias.



 

anything