PDA

View Full Version : Aiuto Spiegazione codice


FabioMarchi
29-10-2019, 17:42
Ciao a tutti, ho questo programma per rappresentare un numero reale in segno esponente mantissa..qualcuno mi potrebbe spiegare nella funzione stampaCodifica cosa fa nel ciclo for? grazie
#include <stdio.h>
#include <math.h>

int controlloEndiannes();
void stampaCodifica (void *ptr, int size, int bigEndian);

int main(){

int bigEndian=controlloEndiannes();
float af;
double ad;
long double ald;
char x[12];
if(bigEndian==0){
printf("Questa macchina e' Little Endian\n");
}else{
printf("Questa macchina e' Big Endian\n");
}
printf( "-Float dimensione: %d byte (%d bit).\n", (int)sizeof(af), 8*((int)sizeof(af)) );
printf( "-Double dimensione: %d byte (%d bit).\n", (int)sizeof(ad), 8*((int)sizeof(ad)) );
printf( "-Long double dimensioni: %d byte (%d bit).\n", (int)sizeof(ald), 8*((int)sizeof(ald)) );

printf("\nInserisci un numero reale (con punto): ");
scanf("%s",x);

sscanf( x, "%f", &af);
sscanf( x, "%lf", &ad);
sscanf( x, "%Lf", &ald);

printf("\nRappresentazione binaria del numero reale (float)\n");
stampaCodifica((void *)&af, sizeof(af), bigEndian);
printf("\nRappresentazione binaria del numero reale (double)\n");
stampaCodifica((void *)&ad, sizeof(ad), bigEndian);
printf("\nRappresentazione binaria del numero reale (long double)\n");
stampaCodifica((void *)&ald, sizeof(ald), bigEndian);

}

int controlloEndiannes(){
unsigned int x=1;
char *c =(char*)&x;
if(c[0]==1){
return 0; //ritorna falso se è little Endian
}else{
return 1; //ritorna vero se è big endian
}


}
void stampaCodifica(void *ptr, int size, int bigEndian){
unsigned char *p = (unsigned char *)ptr;
int start, end, step;
int i, nBit = 0, exp = 0;
int d, temp;
if(size == 16){
size = 10; //non conteggio i byte vuoti nel long double
}
printf("Stampo rappresentazione (%d bit)", size*8);
switch(size){
case 4:
exp = 10;
break;
case 8:
exp = 13;
break;
case 10:
exp = 16;
break;
}

if(bigEndian){ // se è big endian
start = 0;
end = size;
step = 1;
}else{ // se è little endian inverto il ciclo
start = size-1;
end = -1;
step = -1;
}

for(i = start; i != end; i=i + step){
temp = *(p+i);
d = pow(2, 7);
while(d > 0){
nBit++;
if(nBit == 2 || nBit == exp){ // se il bit stampato è il segno o è l'ultimo bit dell'esponente
printf("\n");
}
if(temp >= d){
printf("1");
temp = temp - d;
}else{
printf("0");
}
d=d/2;
}
}
printf("\n");
}

lorenzo001
31-10-2019, 13:25
cosa fa nel ciclo for?


Stampa i vari bit appartenenti alla rappresentazione binaria del valore reale.

Quindi il bit del segno, quelli dell'esponente e quelli della mantissa.