Wertebereich von usigned char in Bezug auf Zeichenausgabe



  • Hallo,

    ich bin momentan am Durcharbeiten des Buches C++ lernen und professionell anwenden. Hierbei bin ich bei einer Aufgabe auf eine Verhaltensweise des Compilers gestoßen, die sich für mich nicht ganz nachvollziehen lässt und die Erklärung des Buches ist in diesem Fall für mich nicht ausreichend. Es wird eine positive Ganzzahl eingegeben und von dieser Ganzzahl soll auch der entsprechende Zeichencode ausgegeben werden. Bei einer Eingabe von 336, erzeugt dies die Ausgabe von P (entspricht dem Wert 80 in der ASCII Tabelle) und hier liegt mein Problem. Ich weiß, dass der Wertebereich von usigned char bei 0-255 liegt und dass 336 über dem Wertebereich liegt. Die Frage die sich mir stellt, ich würde schließen, dass der Compiler den Abstand zwischen 255 und 336 ermittelt, also 81. Aber er scheint den Abstand von 256 zu 336 zu ermitteln, dies entspricht 80 und somit P. Wenn mir jemand diese Verhaltensweise erklären könnte, wäre ich wirklich dankbar, da ich hier etwas im Dunkeln tappe.

    Hier der Beispielcode:

    int main()
    {
    	unsigned char zeichen = 0;
    	unsigned int code = 0;
    
    	cout << "Bitte geben sie einen beliebigen Zeichencode" 
    		 << "(eine positive Ganzzahl) ein: "
    		 << endl;
    	cin  >> code;
    
    	zeichen = code;
    
    	cout << "Die eingegebene Zahl entspricht dem Zeichen: " << zeichen
    		 << endl;
    
    	return 0;
    
    }
    


  • wenn du das verhalten nachprogrammieren möchtest:

    modulo-operator

    zeichen = static_cast<unsigned char>(code % (1 + std::numeric_limits<unsigned char>::max()));
    

    edit: was wirklich passiert wenn du ein wert der grösser ist als std::numeric_limits<unsigned char>::max() (meist 255) einem unsigend char zuweist, ist ub.



  • Danke für deine Antwort.

    Edit: Frage hat sich erledigt, danke für dein Beispiel, das war die Erklärung die ich gesucht habe! 🙂


  • Mod

    igno schrieb:

    edit: was wirklich passiert wenn du ein wert der grösser ist als std::numeric_limits<unsigned char>::max() (meist 255) einem unsigend char zuweist, ist ub.

    das ist entweder wohldefiniert, wenn char vorzeichenlos ist, sonst implementation defined


  • Mod

    das ist entweder wohldefiniert, wenn char vorzeichenlos ist

    Das ist immer wohldefiniert. Lies mal genau dein Zitat. 😉


Log in to reply