Verständnisfrage zu '0'



  • Guten Abend zusammen

    Ich habe erst vor kurzem begonnen, C++ zu lernen und arbeite jetzt Schritt für Schritt ein Tutorial durch. Bin also noch ein Anfänger... 😉

    Nun habe ich eine Frage an euch: Warum bewirkt das Abziehen von '0' bei einem Zeichenstring (in diesem Fall eine Zahl), dass der Wert in eine "richtige" Zahl umgewandelt wird?

    Als Beispiel folgenden Codezeile:

    Wert += input[0] - '0';
    

    Im Index "0" des Arrays steht eine 7 (String). Die Variable "Wert" beinhaltet nach der Ausführung die Zahl "7".

    Vielen Dank für eure Antworten!

    Grüsse
    Miness



  • Wenn du dir die ASCII-Tabelle (z.B. hier: http://www.torsten-horn.de/techdocs/ascii.htm) anschaust, dann siehst du, dass 0-9 dort die Werte 48-57 haben. Hast du also ein Zifferzeichen, dann bekommst du den tatsächlichen Wert, indem du '0' (=48) abziehst.



  • schau, wenn du dir die ASCII tabelle anschaust, dann siehst du, dass Zahlen bei 30-39 stehen und die Zahl 0 hat den ASCII Wert 30 HEX.

    '4' - '0' = 34 - 30 = 4

    http://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange



  • Weil alle Zahlen in den Zeichensätzen hintereinander liegen. Wenn du Werte in '' schreibst bekommst du nicht 0 sondern ein char mit dem Zeichen 0.



  • Also ist bei meinem Fall die "7" eigentlich eine 55 auf der ASCII-Tabelle. Und wenn ich 48 (also "0") abziehe, erhalte ich die "richtige" Zahl 7.

    Danke für eure Hilfe!



  • Miness schrieb:

    Also ist bei meinem Fall die "7" eigentlich eine 55 auf der ASCII-Tabelle. Und wenn ich 48 (also "0") abziehe, erhalte ich die "richtige" Zahl 7.

    Danke für eure Hilfe!

    du darfst einen String nicht mit einem Zeichen verwechseln:

    '7' --> Zeichen --> 1Byte
    "7" --> String --> 2Byte,wegen 0-Terminierung

    was du meinst ist nämlich '7', joa und das ist laut ASCII 55 und davon ziehst 48 an dann landest bei 7



  • OK, danke!

    Also:

    7 = Zahl
    '7' = Zeichen (1 Byte)
    "7" = String (2 Byte)

    Oder?



  • Miness schrieb:

    OK, danke!

    Also:

    7 = Zahl
    '7' = Zeichen (1 Byte)
    "7" = String (2 Byte)

    Oder?

    richtig^^

    "7" besteht nämlich aus '7' und '\0' darum 2byte



  • OK, dankeschön!

    Warum ist denn aber eine String-Variable immer 4 Byte gross?
    Da kann ich eigentlich ja soviele Zeichen speichern wie ich möchte, oder?



  • Miness schrieb:

    OK, dankeschön!

    Warum ist denn aber eine String-Variable immer 4 Byte gross?
    Da kann ich eigentlich ja soviele Zeichen speichern wie ich möchte, oder?

    hä wie meinst du string-variable ?
    das einzige was "immer" 4Byte belegt ist ein Zeiger.
    die Zeichenkette belegt immer so viel Byte, wie groß sie eben ist.

    #include <iostream>
    using namespace std;
    
    int main()
    {
        char zeichenkette[11] = "0123456789"; // 11Byte
    
        cout << endl << sizeof(zeichenkette) << " Byte" << endl;
    
        char* zeiger_auf_zeichenkette = zeichenkette;
        cout << endl << sizeof(zeiger_auf_zeichenkette) << " Byte" << endl;
    
        system("pause>nul");
        return 0;
    }
    

    Theoretisch kannst du so viele Zeichen in eine Zeichenkette packen wie du willst, aber praktisch geht dir irgendwann der Speicherplatz aus^^



  • Mit String-Variable meine ich das hier:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    
        string test = "0123456789";     // 4 Byte
    
        cout << sizeof(test) << endl;
    
    }
    

    Und hier ist die Variable immer 4 Byte gross, egal wieviele Zeichen ich da rein packe... ^^



  • Liegt wahrscheinlich daran, dass std::string intern ebenfalls durch einen Zeiger (nämlich char* ) realisiert ist...

    EDIT: Ich hab den Code gerade in MSVC kopiert - bei mir gibt der grundsätzlich 32 und nicht 4 aus...



  • Ja, die Zeichen werden woanders gespeichert. "test" ist nur eine Art Verweis darauf.



  • Aha, alles klar! Vielen Dank!

    EDIT: @daersc
    Liegt wahrscheinlich am Compiler. Jeder Compiler interpretiert anders. Ich nutze den GCC GNU Compiler.



  • naja "string" ist kein primitiver Datentyp sondern eine Klasse (abstrakter Datentyp).

    Der sizeof operator liefer immer den Speicherplatz, den der Datentyp verbraucht.

    Wie der Datentyp "String" aufgebaut, ist weiß ich net aber er hat halt 4Byte.

    Eventuell hat die Klasse ein "char*" Attribut ?!



  • Um an die Anzahl zu kommen, musst Du test.length() verwenden.



  • Ja, dann gibt der Compiler 10 Byte aus!

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    
        string test = "0123456789";     // 10 Byte
    
        cout << test.length() << endl;
    
    }
    

    Danke!



  • Dweb schrieb:

    Wie der Datentyp "String" aufgebaut, ist weiß ich net aber er hat halt 4Byte.

    Bei ihm. Was sizeof(string) ergibt kann man allgemein nicht sagen.



  • OK, ich kann mir aber auch gut vorstellen dass sizeof(string) nur die Grösse eines Zeiger ausgibt (siehe oben). Aber man weiss es nicht so wirklich... ^^



  • Miness schrieb:

    OK, ich kann mir aber auch gut vorstellen dass sizeof(string) nur die Grösse eines Zeiger ausgibt (siehe oben). Aber man weiss es nicht so wirklich... ^^

    Richtig, es wird wohl nur eine Art Handle sein (void*), aber verlassen kannst Du dich darauf nicht.



  • Miness schrieb:

    Ja, dann gibt der Compiler 10 Byte aus!

    string test = "0123456789";     // 10 Byte
    

    ne, das was du ausgibst ist die länge der Zeichenkette, diese hat nix mit der Byteanzahl zu tun, du allokiert wird.

    #include <iostream>
    using namespace std;
    
    int main()
    {
        char ar[] = "0123456789";
    
        cout << sizeof(ar) << endl; // Byte
        cout << strlen(ar) << endl; // Länge
    
        system("pause>nul");
        return 0;
    }
    

Anmelden zum Antworten