Ciao a tutti.
Più che risolvere un problema,avrei bisogno di una delucidazione che non sono riuscito a trovare sul web.
Il programma in questione estrae determinati bit da una variabile di tipo long e ne attribuisce 1 a una variable di tipo short,8 a una di tipo int e 23 ad una di tipo int. Dopodichè, effettua un cast a float a tutte e 3,per usarle in determinate formule, per poi moltiplicarle e restituire un float.
Ora,sapendo che, il size di:
- int, è 16 bit;
- short, è 16 bit;
- long, è 32 bit;
Da logica,dato che l'estrazione avviene per operatori binari con la variabile input di tipo long, le variabili che estraggono 23 bit e 8 bit dovrebbero essere di tipo long,ma il risultato della formula,che moltiplica le 3 variabili, risulta essere corretto solo nel caso in cui le 2 variabili sopra citate siano di tipo int.
La mia domanda è :
1. Perchè funziona con int che è a 16 bit e non con long che è a 32?
2. Dato che funziona con int, perchè non funziona dichiarandole di tipo short visto che hanno lo stesso size?
Codice (la variabile che riporta il risultato è "val"):
char i,segno=0;
long mask=0x7f800000;
int mantissa,esponente; /* Variabili in questione dichiarate sia come int,long e short */
float val,val_man,a,b,c;
segno=reg>>31;
esponente=reg&mask;
esponente=esponente>>23;
mantissa=reg<<9;
mantissa=mantissa>>9;
for (i=31;i>=0;i--)
{B[i]=(char)(1 & reg);
reg=reg>>1;
}
a=pow(-1,(float)segno);
b=pow(2,((float)esponente-127));
c=fabs((float)mantissa)*pow((float)2,-23)+1;
val=a*b*c;
printf("val=%f",val);
Output di "val" con "mantissa" ed "esponente" dichiarate di tipo int:
Output di "val" con "mantissa" ed "esponente" dichiarate di tipo long:
Output di "val" con "mantissa" ed "esponente" dichiarate di tipo short:
Grazie.