Pregunta sobre programacion en C

Sabria algun decirme como convertir un dato float (4 bytes) en un array de unsigned char?

La cosa es poder tratar cada uno de los 4 bytes del float por separado.


Saludos :P
mmmm, si lo que quieres es "separar" los 4 bytes, lo que puedes hacer son desplazamientos de bit...desplazas y te quedas con lo que te interesa.

Si lo quieres meter en un unsigned char por webos, puedes usar..mmmm...pera...mmmm..weno, puedes usar un sprintf(cadenita,"%f",valorfloat); y lo tendrás ahí metidito, con su punto y todo, y tb puedes formatear la cadena pa q te salgan más o menos decimales.

Saludos
la segunda opcion del sprintf no es lo q busco, eso seria para tener en una cadena el valor, pero lo q yo quiero va mas por la direccion de tu primera opcion.

Sin embargo lo del desplazamiento a nivel de bits no esta permitido para float. El compilador chilla cawento.

float f=123.456;
vector_float=new unsigned char[4];
vector_float[0]=(unsigned char)f ;
f <<= 8;
vector_float[1]=(unsigned char)f ;
f <<= 8;
vector_float[2]=(unsigned char)f ;
f <<= 8;
vector_float[3]=(unsigned char)f ;
f <<= 8;


Saludos :P
para que quieres tener los datos en un uchar? más que nada para hacerme una idea, y ver si entre los dos podemos sacar una solución

saludos
de todos modos los float van empaquetaos y tal...no sé si iran en BCD o en otro formato...así que me parece que desplazamientos pocos...:(

Saludos
lo q quiero hacer es q dada una variable (ya sea int, float, double...) es acceder a sus bytes por separado.

Poder acceder a los bytes, tal cual, q estan almacenados en memoria.

MEMORIA:

1A <- float
4C
92
B7

Lo q quiero es acceder a cada uno de esos bytes por separado, sin tener en cuenta el valor total del float.


Saludos :P
muy por los pelos,pero...puedes acceder así (ten en cuenta q los flotas están empaquetados, así que poco vas a poder ver)


float f=11.15f;  // variable float
unsigned char *nada; //puntero unsigned char (size =1 )
nada= &f; //asignamos el puntero

printf("%d",*nada); //mostarmos valor del primer byte del float

*nada++; // adelantamos 1 byte (por eso hemos usado un puntero unsigned char)
printf("%d",*nada); //mostramos de nuevo




Mira a ver si eso te vale

Saludos
unsigned int sinsigno=1214;

nada= &sinsigno;

printf("%.2X",*nada);

*nada++;
printf("%.2X",*nada);

*nada++;
printf("%.2X",*nada);

*nada++;
printf("%.2X",*nada);


Los unsigned int van bien para éstas cosas, pq no tienes q preocuparte del signo... así que te saldría lo siguiente de resultado (el %.2X es para que me saque los 2 numeros en HEX)


:BE040000

Que pasandolo al formato de INTEL
04BE (quitamos los ceros q sobran)

lo que me da

1214

Imagino q es eso lo que querías.

Saludos
Cortesia de Psycho (un colega):

float f=123.456; //vble float (4 bytes)
unsigned char *v=new unsigned char[4]; //puntero a array uchar (4x1byte)
unsigned char *temp; //puntero a char

temp=(unsigned char*)&f;
// realmente es lo mismo un puntero a char, que a float, que a un tipo
// del usuario, no es mas que una direccion de memoria (es decir, un
// unsigned int, o 4 bytes en los PCs, pero hay q poner explicitamente
// el casting para que el compilador no grite

for (i=0;i<4;i++)
{ v[i]=*temp;
temp++;
}

// para volver a "montar" el float a partir del array:
float *f2;
f2=(float*)v;

// asi tendriamos los 4 bytes q representan el float en el array uchar
// este mismo procedimiento valdria para cualquier tipo de datos, solo
// hay q tener cuidado de saber los bytes q ocupa, por ejemplo un float
// en una arquitectura no PC puede tener distinto tamaño

// detalle final, hemos copiado cada uno de los bytes de f al array,
// porque si hubieramos hecho directamente: v=(unsigned char*)&f
// eso seria correcto, pero si ese codigo esta dentro de una funcion
// al acabar la funcion, v apuntaria a una direccion de memoria invalida
// puesto que lo que la vble f al estar declarada como estatica se
// ubicaria en el espacio de direcciones de la funcion que tras terminar
// su ejecucion se eliminaria de la memoria
// si f hubiera sido dinamica no pasaria nada porque donde realmente
// estaria el float seria en el heap con lo que no se perderia el float

// esto probablemente lo sabria la mayoria, pero por si alguien no lo
// veia del todo claro no estaba de mas aclararlo ;-)



Saludos :P
8 respuestas