Erklärung der Funktion



  • Hi,

    mein Name ist Carsten und ich habe mich in letzter Zeit mit dem Programm C beschäftigt und auch schon einige Programme geschrieben.
    Als ich beim Thema Zeiger angekommen bin, wurde es auch für mich kurzzeitig schwer sie zu verstehen.
    Nun bastel ich an einem weiteren Programm(binäre Darstellung von double Zahlen). Die Aufgabe lautet ein vorgegebenes Programm so zu modifizieren, sodass ich kein Makro mehr habe und double Zahlen darstellen kann.

    Original Programm:

    # include <stdio.h>
    
        # define PRINT_BIN_FLOAT(Xf) {          \
        unsigned int Xi , Xa;                   \
        Xa = *( unsigned int*) &Xf;             \
        for(Xi = sizeof ( float )*8; Xi > 0;)   \
    {                                           \
        Xi --;                                  \
        printf ("%d%s", Xa >> Xi &1,            \
        (Xi == 31 || Xi == 23)?" ":"");         \
        }                                       \
        }
    
    int main () {
    printf (" Geben Sie eine Zahl ein:");
    float a;
    scanf ("%f", &a);
    printf ("%f\n", a);
    PRINT_BIN_FLOAT(a);
    
    return 0;
    }
    

    Das Makro habe ich schon zu einer Funktion umgeschrieben, die double Darstellung habe ich versucht. Dabei komme ich allerdings nicht weiter, da ich folgende Zeile (Nummer 5) nicht verstehe.

    Xa = *( unsigned int*) &Xf;
    

    Xa bekommt den gecasteten Adresswert von Xf(also der eingegebene Wert a in der main Funktion) zugewiesen. Nur was sollen die Pointeranweisungen im und vor dem Cast?

    Danke fürs erste!



  • hi,

    ( unsigned int*) &Xf
    

    bedeutet so viel wie:
    mach aus der adresse von Xf eine unsigned int adresse. es wird die anzahl der bytes festgelegt.

    Xa = *( unsigned int*) &Xf;
    

    die unsigned int adresse wird dereferenziert und der wert wird Xa zugewiesen.



  • Danke für diesen Beitrag!! Dennoch reicht mir das persönlich noch nicht genug um das ganze zu verstehen.

    Das heißt aus der Speicheradresse (z.B. 123456) wird eine unsigned int Variable gemacht. Nur wie wird da die Anzahl der Bytes festgelegt bzw. wie ergibt der sich aus der Speicheradresse?

    Gruß



  • mstrkrft schrieb:

    Das heißt aus der Speicheradresse (z.B. 123456) wird eine unsigned int Variable gemacht. Nur wie wird da die Anzahl der Bytes festgelegt bzw. wie ergibt der sich aus der Speicheradresse?
    Gruß

    ja, so in etwa: beim dereferenzieren werden sizeof(unsigned int) bytes an der adresse 123456 eingelesen. festgelegt/berechnet wird das durch den compiler anhand der syntax.
    das hier:
    char Xa = ( char) &Xf;
    würde sizeof(char) bytes (meist ein byte) vom typ char einlesen und das:
    double Xa = ( double) &Xf;
    würde sizeof(double) bytes (meist acht byte) einlesen, usw.

    der cast (char*) &Xf legt also "die sichtweite des zeigers" auf sizeof(char) byte fest.
    dann werden bei char Xa = ( char) &Xf; sizeof(char) bytes dereferenziert und zugewiesen.
    um den kreis zu schließen:
    bei der dereferenzierung muss ja die anzahl der zu lesenden bytes bekannt sein - das erreicht man durch die festlegung oben genannter sichtweite.

    gruß,
    ->°|°<-


Anmelden zum Antworten