Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    55

    [C] Cambio tipo di dato

    Eccomi di nuovo con le mie domande banaline

    Questa volta è teoria e non codice

    Prima di tutto volevo ringraziare oregon per l'altra volta, ormai il post è finito così lontano che mi sembrava stupido ritirarlo su
    Comunque la mia domanda è questa..Cosa succede se un tipo di dato dichiarato char viene portato per valore in una variabile dichiarata float (e che quindi lo restituisce sotto forma di float) ?

    Ho trovato su un sito di una università diversi programmini sui tipi di dato float e oltre a fare questo...C'erano altri programmini che nei parametri delle function, le variabili avevano un tipo di dato diverso..Per esempio veniva inserito in input come float, ma la function se lo riportava come long int...Queste procedure per caso funzionano come dei cast?

    E poi se gli cambi il tipo di dato all'interno dei parametri della function..il pre compilatore non rischia di fare confusione?

    Grazie

  2. #2
    Qualcosa del genere?
    codice:
    #include <stdio.h>
    
    void funzione(char param)
    {
        printf("%d",(int)param);
    }
    
    int main(void)
    {
        float n=7.5f;
        funzione(n);
        return 0;
    }
    Nulla di strano, viene automaticamente effettuato un cast da float a char (fa parte dei cast impliciti consentiti dal C). D'altra parte non è una pratica molto ben vista e può condurre facilmente ad errori di overflow.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    55
    Non funzionava proprio così..

    portava un float in una function long int come un parametro long int..e veniva riportato poi in una variabile sempre dichiarata in long int


    tipo così


    ...

    long int function (long int *n)

    void main()
    {
    float x;
    long int y;

    scanf("%f", &x);
    y=function(&x);
    }

  4. #4
    Sei sicuro che alla funzione venisse passato per puntatore? Perché così non è possibile, a meno di non metterci un cast esplicito (che però non avrebbe senso).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    55
    il programma nel pdf era scritto in questo modo:

    #include <stdio.h>
    #define bias 127

    long int estrae_esp(long *);

    void main()
    {
    float x; short xesp;

    scanf("%f",&x);
    xesp=(short)estrae_esp(&x);
    printf("esp = %d\n",xesp);
    }

    long int estrae_esp(long *n)
    {
    long int xesp,mask;

    mask=0x7f800000;
    xesp=*n&mask;
    xesp=xesp>>23;
    xesp=xesp-bias;
    return xesp;
    }

  6. #6
    Dunque, l'ho collaudato e, nonostante i warning, funziona. Il C consente di passare qualunque tipo di puntatore senza problemi (salvo gli ovvi warning del caso), il mio dubbio derivava dal fatto che di solito lavoro in C++ che non consente queste porcherie. Comunque, il concetto qui è che passi un puntatore a float che viene interpretato dalla funzione come un puntatore a long, in modo da effettuarci le operazioni bitwise che ne estraggono l'esponente. Un modo più ortodosso di fare ciò, comunque, sarebbe stato questo:
    codice:
    long int estrae_esp(float n)
    {
        long int xesp,mask;
    
        mask=0x7f800000;
        xesp=*((long int *)&n)&mask;
        xesp=xesp>>23;
        xesp=xesp-bias;
        return xesp;
    }
    in questo modo si eliminano i warning e si rende chiaro al chiamante che deve passare un float.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Un altro modo per utilizzare i bitwise su variabili float o double consiste nel ricorrere alle union. Con qualcosa del genere:

    codice:
    union float_int {
       float x;
       int y;
    };
    
       ...
    
       union float_int my_union;
    
       ...
    
       scanf("%f", & my_union.x)
    
       ...
    
       mask = 0x7f800000;
       xesp = my_union.y & mask;
       xesp >>= 23;
       xesp = xesp - bias;
       
       ...
    utilizziamo i bitwise su un valore intero (my_union.y) che però ha la stessa rappresentazione binaria del valore float my_union.x...

    Non avevo mai pensato alla soluzione con l'indirizzo... mi sembra abbastanza intelligente (ovviamente con la correzione di MItaly).
    every day above ground is a good one

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.