[C] int,short,long;

di il
10 risposte

[C] int,short,long;

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.

10 Risposte

  • Re: [C] int,short,long;

    In un sistema a 32 bit l' int è a 32 bit.
  • Re: [C] int,short,long;

    Ciao oregon,
    scusami ma il mio sistema è a 64 bit... sapresti dirmi anche in questo caso il perchè dei 3 output diversi?

    Grazie
  • Re: [C] int,short,long;

    Sì, ma tu stai compilando con un compilatore in modalità a 32 bit.

    In ogni caso, controlla velocemente con una sizeof la grandezza dei tipi usati.

    P.S. Dove è dichiarato reg ? Che vettore è B[] ?

    Il codice deve essere completo e compilabile ...
  • Re: [C] int,short,long;

    Giusto!
    avrei dovuto pensarci prima al sizeof.
    Comunque reg è dichiarato nell'intestazione della function come long.
  • Re: [C] int,short,long;

    Completa il codice altrimenti non si può provare ... manca anche B[]
  • Re: [C] int,short,long;

    Function estre_bit:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <float.h>
    #include <math.h>
    
    void estre_bit(long reg,char B[32])
    {
        char i,segno=0;
        long mask=0x7f800000;
        int mantissa,esponente;
        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;
    
        printf("\nint=%d,short=%d,long=%d,float=%d\n",sizeof(int),sizeof(short),sizeof(long),sizeof(float));
        val=a*b*c;
    
        printf("verifica=%f",val);
    }
    
    Main:
    #include <stdio.h>
    #include <stdlib.h>
    
    #include <float.h>
    
    void estre_bit(long,char[32]);
    
    void main()
    {
        union b{float fa; long la}a;
        char i,bit[32];
        printf("Inserire float da convertire:\n");
        scanf("%f",&a.fa);
        estre_bit(a.la,bit);
        printf("\tfloat = %e\n",a.fa);
        printf("\thex= %08x\n",a.la);
        puts("bit corrispondenti\tsegno esponente mantissa\n");
        for (i=0;i<32;i++)  (i==1|i==9)? printf(" %1d",bit[i]): printf("%1d",bit[i]);
        puts("\n");
        system("PAUSE");
    }
    
    Di nuovo grazie.
  • Re: [C] int,short,long;

    Intanto questa

    (i==1 | i==9)

    deve essere

    (i==1 || i==9)

    Hai provato i sizeof?
  • Re: [C] int,short,long;

    Si,con questi risultati:
    - int, 4 byte;
    - short, 2 byte;
    - long, 8 byte;
    - float, 4 byte.

    Che mi spiegano perchè l'output è diverso tra short ed int...ma ancora non mi è ben chiaro il long...

    Forse nel cast avviene un tipo di conversione diverso? Ovvero quel valore rappresentato su 8 byte risulta essere più "preciso" dall'essere rappresentato su 4?
  • Re: [C] int,short,long;

    Il problema è nel calcolo della mantissa che deve essere limitato a 32 bit cosa che non avviene con il long a 64 bit. Basta scrivere

    mantissa=(reg<<9) & 0xFFFFFFFF;
  • Re: [C] int,short,long;

    Grazie mille oregon.
    A dirla tutta non mi è ancora proprio chiaro il perchè una long_a=long_b>>n; per poter risultare richieda anche un &0,ma va bene così.

    Grazie
Devi accedere o registrarti per scrivere nel forum
10 risposte