Darstellungen von Zahlen



  • Hallo!
    Wir haben bisher im Kurs Pointer durchgenommen und beschäftigen uns derzeit mit den Rechenoperatoren im Rechner (also Binärdarstellung, usw.).
    Jetzt habe ich die Aufgabe bekommen, eine Funktion zu schreiben, die als Eingabe einen Pointer auf eine int-Zahl erhält.

    Dann sollen die Länge in Bytes (per sizeof) und die Speicheradresse der Zahl ausgegeben werden.
    Abschließend sollen die Speicheradressen der einzelnen Bytes und deren Inhalt ausgegeben werden. Als Hinweis hierfür haben wir, dass wir eine erzwungene Typumwandlung in char machen sollen, da dieser Typ genau 1 Byte lang ist:

    (char *)& zahl
    

    So, hier mal mein Versuch:

    void fkt(int* a)
    {
    cout << "Zahl:" << *a << endl;
    cout << "Speicheradresse:" << a << endl;
    cout << "Laenge:" << sizeof(int) << endl << endl;
    
    for (int i=0;i<sizeof(int);i++)
    {
        int zahl=*a;
        char* p=(char*)&a+i;
    
        cout << i << ".tes Byte: Adresse: " << p << " Inhalt: " << *p << endl;    
    }
    }
    

    Allerdings erhalte ich nicht die gewünschten Ergebnisse, sondern z.B.

    Bitte a eingeben: 12

    Zahl: 12
    Speicheradresse: 0x28ff24
    Laenge in Bytes: 4

    0.tes Byte: Adresse: $ ( Inhalt: $
    1.tes Byte: Adresse:  ( Inhalt:  
    2.tes Byte: Adresse: ( Inhalt: (
    3.tes Byte: Adresse: Inhalt:
    Drücken Sie eine beliebige Taste . . .

    Könnt ihr mir sagen, wo der Fehler liegt?



    1. C casts wie du sie verwendest (oder dein Lehrer dir beigebracht hat) sind seit ca. 12 Jahren veraltet, C++ bietet eigene casts an.
    int i = 7;
    char* c (char*) &i; // C cast
    char* cpp = reinterpret_cast<char*>( &i ); // C++ cast
    
    1. Bei der Zeigerarithmetik wird der zu Grunde liegende Datentyp berücksichtigt, d.h. wenn du einen Zeiger auf einen 32bit Integer um 1 erhöhst, dann wird der Zeiger um 32bit erhöht (also auf das hinter dem aktuellen Element liegendende Element verbogen). Wenn du die Bytes eines Integers ausgeben willst musst du zuerst einen Zeiger auf das 1. Byte des Integers erzeugen und dann diesen Zeiger erhöhen.


  • char* p=(char*)&a+i;
    char* p=(char*)a+i;
    

    Eigenlich war bei dir nur das &-Zeichen zuviel. Dadurch hast du die Adresse des Zeigers herangezogen, anstatt den Zeiger einfach zu konvertieren.
    Jetzt ist das zwar korrekt, doch die Ausgabe würde bei Adresse und Wert gleich sein, einfach weil cout es speziell bei charzeigern so handhabt.
    Den musst du dann auch noch convertieren bei der Ausgabe.

    cout << i << ".tes Byte: Adresse: " << p << " Inhalt: " << *p << endl; 
       cout << i << ".tes Byte: Adresse: " << (int*)p << " Inhalt: " << *p << endl;
       // im speziellen Fall des Char-Zeigers ginge auch das hier
                                                   [...] " Inhalt: " <<  p << endl;
    


  • Um Missverständnissen aus dem Weg zu gehen, ich habe p in der Ausgabe nicht in einen int-Zeiger konvertiert weil der Parameter ein Zeiger auf ein Int war.
    Wichtig ist einfach, dass der Typ des Zeigers eben nicht char ist, wenn du die Ausgabe mit cout machst. Könnte sonst was fürn Zeiger sein.



  • Hi!
    Danke für eure Hilfe. Die Adresse passt nun, aber beim Inhalt erhalte ich immer noch komische Zeichen. Ich weiß ja nicht was rauskommen soll, aber ich hätte jetzt die Binärdarstellung der Zahl erwartet, stattdessen bekomme ich komische Sonderzeichen oder nichts, egal welche der beiden Methoden ich einsetze.

    cout << i << ".tes Byte: Adresse: " << p << " Inhalt: " << *p << endl; 
       cout << i << ".tes Byte: Adresse: " << (int*)p << " Inhalt: " << *p << endl;
       // im speziellen Fall des Char-Zeigers ginge auch das hier
                                                   [...] " Inhalt: " <<  p << endl;
    


  • ja, "komisches Zeichen" ist im allgemeinen korrekt, bei char unter cout.
    char ist an und für sich ein Datentyp der Zahlen speichert.
    Gibstdu den Kram mit cout aus, wird der Wertin char als ASCII-Wert interpretiert und entsprechend ausgegeben.
    Möchtest du den ASCII-Code, konvertiere den Kram einfach mal nach int.

    cout << i << ".tes Byte: Adresse: " << (int*)p << " Inhalt: " << (int)*p << endl;
    

    Um zu prüfen ob das jeweisl richtig ist, schau dir einfach mal eine ASCII-Tabelle an. Wenn der Dezimale Wert dem Zeichen entspricht das du siehst ist das korrekt.
    http://www.morbleu.com/wp-content/uploads/2009/08/ascii.gif

    oder hier
    http://www.torsten-horn.de/techdocs/ascii.htm

    Wenn die Zahl unter


Anmelden zum Antworten