[gelöst]strtoll/strtoull und 64bit hex Zahlen



  • Hallo,

    ich bräuchte mal Hilfe bei einem kleinen Programm. Ich möchte einen 64 bit hex Int (also long long int) von der Kommandozeile lesen.

    #define _LARGEFILE64_SOURCE //für lseek64
    
    //includes...
    
    int main(int argc, char** argv){
        printf("%s\n", argv[1]);
    
        errno = 0;
        const off64_t addr = (off64_t)strtoll(argv[1], NULL, 16);
        if(errno ...){
            //...
        }
    
        printf("%llx\n", (long long int)addr);
    
        //...
    
        lseek64(... addr ...);
    
        //...
    }
    

    Beispielausgabe des Programms:

    ./prog 0x1111222233334444
    0x1111222233334444 //print als string
    33334444 //print nach strto[u]ll
    

    Selbe Ausgabe bei strtoll/strtoull.

    Ich verstehe das nicht, ich habe doch strtoll und nicht strtol. Damit müsste doch immer ein long long gelesen werden!? Hat jemand eine Idee?
    Vielen Dank!



  • Hättest du ein kompilierbares Beispiel gepostet, hätte man sehen können, welche Header von dir verwendet wurden. Hast du stdlib.h vergessen? Dann wird nämlich strtoll implizit deklariert und gibt int statt long long zurück.



  • Ohw maaaan!

    Danke!!! Ja, ich hab stdlib.h vergessen... Da hat man so viele includes (deshalb hab ich sie weg gelassen) und vergisst den Wichtigsten 🙄

    Wobei mich interessieren würde, warum ich dann einen Wert zurückbekomme?
    Ich dachte bei implizit deklarierten Funktionen wird der Standardwert (bei int also 0) zurückgegeben... Warum wird dann hier ein "Fallback" auf strtol gemacht?

    Außerdem dürfte strtol doch auch nicht deklariert sein ohne stdlib.h?

    Nochmals vielen Dank!



  • </Exit> schrieb:

    Wobei mich interessieren würde, warum ich dann einen Wert zurückbekomme?

    Undefiniertes Verhalten. Praktisch wird es wohl so aussehen, dass strtoll seinen 64-Bit-Rückgabewert irgendwo ablegt, möglicherweise in einem 64-Bit-Register, und das aufrufende Programm dort reingreift und nur 32 Bit rauszieht.

    Ich dachte bei implizit deklarierten Funktionen wird der Standardwert (bei int also 0) zurückgegeben...

    Das würde implizit deklarierte Funktionen ja völlig sinnlos machen. Zu K&R-Zeiten war es aber völlig üblich, Deklarationen nur zu schreiben, wenn man sie auch braucht, d.h. wenn der Rückgabetyp nicht int ist.


Anmelden zum Antworten