Per interpretarlo in realtà probabilmente non si vorrebbe trattarlo come byte in ogni caso perché i limiti di mantisa non si allineano a un intervallo di 8 bit.
Qualcosa sulla falsariga di:
mantisa = (*(unsigned int *)&floatVal) | MANTISA_MASK;
exp = ((*(unsigned int *)&floatVal) | EXP_MASK ) >> EXP_SHIFT;
sign = ((*(unsigned int *)&floatVal) | SIGN_MASK ) >> SIGN_SHIFT;
lasceremmo metto da parte per giocare con il centro succo.
EDIT:
#include <stdio.h>
void main()
{
float a = 4;
unsigned int exp,sign,mantisa;
int i;
for(i = 0;i<4;i++)
{
exp = (*((unsigned int *)&a) >>23) & 0xFF;
sign = (*((unsigned int *)&a) >>31) & 0x01;
mantisa = (*((unsigned int *)&a)) & 0x7FFFFF | 0x800000;
printf("a = %04x\r\n",*((unsigned int *)&a));
printf("a = %f\r\n",a);
printf("exp = %i, %02x\r\n",exp,exp);
printf("sign = %i, %02x\r\n",sign,sign);
printf("mantisa = %i, %02x\r\n\r\n",mantisa,mantisa);
a = -a/2;
}
}
produce:
a = 40800000
a = 4.000000
exp = 129, 81
sign = 0, 00
mantisa = 8388608, 800000
a = c0000000
a = -2.000000
exp = 128, 80
sign = 1, 01
mantisa = 8388608, 800000
a = 3f800000
a = 1.000000
exp = 127, 7f
sign = 0, 00
mantisa = 8388608, 800000
a = bf000000
a = -0.500000
exp = 126, 7e
sign = 1, 01
mantisa = 8388608, 800000
Press any key to continue . . .
Sì, ma questo comportamento non è definito (accesso a un valore float utilizzando un puntatore int). Hai la certezza di poter accedere ai byte di un oggetto come una matrice di caratteri non firmati (in C, almeno - Non sono sicuro della dicitura paragonabile nello standard C++), ma non come altri tipi di dati, in generale . In particolare, l'ottimizzatore del compilatore ha il diritto di presumere di non averlo fatto e di applicare ottimizzazioni che possono infrangere il codice se ne hai. – dewtell
Inoltre, dovresti prendere l'indirizzo di floatVal prima di lanciarlo comunque su un altro tipo di puntatore. Un esempio di ciò che stavo dicendo sull'ottimizzatore: se il compilatore manteneva il valore corrente di floatVal in un registro, l'ottimizzatore avrebbe il diritto di presumere che non aveva bisogno di versare il valore corrente in memoria prima di eseguire questo codice, poiché quei puntatori int non possono accedere legalmente al valore float. Quindi, anche se il comportamento indefinito non ha fatto esplodere il tuo computer, potresti facilmente raccogliere la spazzatura casuale piuttosto che l'ultimo valore di floatVal con questo codice. – dewtell
Funziona su big e little endian. – NoMoreZealots