Datentyp uint8_t



  • Hallo liebe Community,

    ich habe mal eine Frage bezüglich eines Datentyps.

    Das Datentyp "std::uint8_t" steht doch für einen Wertebereich von 0 ...255. Es müsste doch in der Lage sein, meine Werte von 0-10 mit einer for-Schleife im Terminal ausgeben zu können. Mit 16, 32 klappt es aber mit 8 nicht. Woran liegt das? Hier einmal mein Code.

    #include <iostream>
    
    int main()
    {
        //std::uint32_t i;
        //std::uint16_t i;
        std::uint8_t i;
    
        for (i = 0; i <= 10; i++)
        {
            std::cout << i << std::endl;
        }
    
        return 0;
    }
    
    

    Ich bekomme auch keine Fehlermeldung, die Zahlen von 0....10 werden im Terminal einfach nicht ausgeben. Ich programmierte in Vs-Code unter Linux.

    Gruß
    Robert


  • Mod

    Eieiei, das ist eine zugegeben dumme Eigenart von C++, auf die du da gestoßen bist. Ganz allgemein sind Buchstaben und andere Zeichen für den Computer auch nur Zahlen, ganz unabhängig von der Sprache. Wenn du einen char hast, ist das daher auch nur ein Integer unter einem anderen Namen. Jetzt wäre es aber etwas unpraktisch, wenn Ausgabefunktionen ein Zeichen als Zahl ausgeben.

    char A = 'A';
    cout << A;
    

    Wäre doof, wenn da "65" statt "A" ausgegeben würde. Daher versucht die Ausgabefunktion da clever zu sein. Wenn sie den Datentyp char als Argument bekommt, dann gibt sie Buchstaben aus, obwohl char eigentlich technisch gesehen ein Integertyp ist.

    Nun sind auf den meisten Systemen die char-Datentypen die einzigen Integertypen mit 8-Bit. Daher ist in solchen Fällen uint8_t ein typedef für unsigned char, weil es sonst keine Alternativen gibt. Wenn du jetzt aber einen uint8_t als Argument an cout gibst, dann sieht das cout als ein char-Argument, denn typdefs sind nur Aliase für den Programmierer ohne technische Bedeutung. Das cout gibt deine Zahlen 0-10 dann also als Buchstaben aus. Die Buchstabenzeichen, die zu den Zahlenwerten 0-10 gehören, sind aber weder die Ziffern '0'-'9', noch die ersten 10 Buchstaben des Alphabets, sondern es sind spezielle Sonderzeichen für Fernschreiber, Telegraphen und ähnliche Geräte. Diese Zeichen haben keine grafische Darstellung, darum kann man die in der Ausgabe nicht sehen (aber technisch gesehen gibt cout an die Konsole die Anweisung, diese Zeichen anzuzeigen, man sieht bloß nix, weil es nix zu sehen gibt). Zeichen Nummer 7 läutet beispielsweise die Alarmglocke (die dein Computern nicht hat), Zeichen Nummer 4 zeigt das Ende einer Nachricht an (und der Fernschreiber wird dann vielleicht die gedruckte Seite auswerfen, was auch nicht wirklich einen Effekt hat am Computer).

    Warum kennt dein Computer so komische Zeichen für ganz andere Geräte, die gar nix machen am Computer? Das hat Gründe in der Geschichte von Computern, die in ferner Vergangenheit auch mit solchen Geräten reden mussten (und die Geräte untereinander natürlich auch), und man daher die Zeichen untereinander standardisiert hat. Ein paar dieser Zeichen hat man dann auch im Computer eine Bedeutung gegeben, wo es Sinn ergab. Zeichen Nummer 7 hat früher den internen Lautsprecher geläutet, aber heutzutage haben Computer meistens keinen solchen Lautsprecher mehr. Zeichen Nummer 10 springt zur nächsten Zeile, was auch in einem Computerterminal Sinn ergibt.



  • Was ist, wenn man unsigned short verwendet?



  • @Erhard-Henkes sagte in Datentyp uint8_t:

    Was ist, wenn man unsigned short verwendet?

    Einfach mal ausprobieren 😉
    Verhält sich wie alle anderen Integer-Typen auch (d. h. standardmäßig wird der Dezimalwert in Zeichen 0-9 ausgegeben), mit eben Ausnahme von signed/unsigned char. Das liegt auch im Grunde genommen nur am operator<< der iostream Bibliothek.


Anmelden zum Antworten