|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Oct 2019
Messaggi: 1
|
Aiuto Spiegazione codice
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
Codice:
#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"); } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:46.