gdb und float in Argumentliste von printf



  • Hallo zusammen,

    ich habe ein Problem mit dem Verständnis der Darstellung einer Kommazahl (float) auf dem Stack. Siehe Code und GDB ausgabe. Wie wird die KOmmazahl umgewandel? Das IEEE754 format ist es anscheind nicht. Oder steht der float garnicht an der stelle mit den Fragezeichen? Kann mich jemand erleuchten?

    Hier der C-Code:

    #include <stdio.h>
    #include <string.h>
    int main(){
    char * mystring = "forFun";
    printf ("eine zahl: %i ein Problem: %f myString : %s\n", 1 , 1.234 , mystring );
    return 0;
    }
    

    Hier die Ausgabe:

    (gdb) c
    Continuing.
    eine zahl: 1 ein Problem: 1.234000 myString : forFun

    Hier der Stack Frame:

    (gdb) x/80x $ebp
                                 //Return Adr //Format Sting  // die 1
    0xbffff718:	0xbffff758	0x0804841c	0x080484f8	0x00000001
    
                   //????????    //????????      //forFun
    0xbffff728:	0xc8b43958	0x3ff3be76	0x080484f0	0x00283ff4
    0xbffff738:	0x08048440	0xbffff758	0x0015d4a5	0x0011e0
    .
    .
    .
    

    P.s.: Eine kleine Nebensache, als 1. wird die Ret Adresse auf den Stack gelegt dann die Variablen. Der Stack wächst richtung kleine Adresse hier ist aber die Return Adresse auf einer kleinen und die variablen wachsen gen große adressen? Kann mir das jemand erklären? Ich glaube ich habe da einfach nur einen Denkfehler.

    Güße,
    LausBub



  • Du übergibst da einen double -Wert, der anscheinend 8 Bytes belegt.



  • Ich glaube nicht, dass "forfun" auf dem Stack landet. Das ist eine Konstante.



  • Ok ich habs.
    Ausgeben kann man sich den float mit:
    (gdb)x/gf <speicheradresse der linken 5 Byte> hier 0xbffff728

    Die Ausgabe ist dann 1.234. Um das mit den gängigen iee754 umrechnern nachvollziehen zu können muss man die datenbits im umgekehrter reihenfolge eingeben (die 4 byte jeweils vertauschen) Das sieht dann so aus:
    3ff3be76c8b43958 . Raus kommt dann 1.2340000000000000

    Grüße,
    LausBub



  • 1.234f ist ein float.


Anmelden zum Antworten