Rechnung mit char Daten



  • Hallo liebe Community,

    ich habe das Forum schon oft besucht, aber nun finde ich leider keine passende Lösung.
    es geht um folgendes:

    #include <stdio.h>
    #include <stdlib.h>
    
    main(){
           fflush(stdin);
           char a=30, b=10, c;
    
           c = a * b;
           printf("%d %x\n",c,c);
    
           system("pause");
           return 0;
           }
    

    Warum ergibt in diesem Fall die Variable c nicht 300, sondern 42, wenn im folgenden Fall die 300 ausgepuckt werden:

    #include <stdio.h>
    #include <stdlib.h>
    
    main(){
           fflush(stdin);
           char a=30, b=10, c;
    
           //c = a * b;
           printf("%d %x\n",a*b,a*b);
    
           system("pause");
           return 0;
           }
    

    Es wäre super, wenn ihr mir helfen könntet.
    Gruß
    Nik



  • Welchen Wertebereich hat char ?


  • Mod

    Listing1:
    Höchstwahrscheinlich wird das Ergebnis der Multiplikation in Zeile 8 nicht in c passen und es zu einem Überlauf kommen. (chars sind auf fast allen Systemen 8 Bit breit)
    Es sollte aber 44 statt 42 rauskommen, ansonsten hast du die kurioseste char-Definition die ich je gesehen habe.

    Listing 2:
    a*b ist hingegen ein Integer (Integral promotion), da ist alles richtig.

    Beide Listings:
    fflush(stdin) erzeugt im Allgemeinen undefiniertes Verhalten, bloß bei der Microsoft-Standardbibliothek ist das eine spezielle Erweiterung.
    Default int zu benutzen ist Stil wie von 1988 oder für den IOCCC.
    system("pause") funktioniert auch nicht portabel.



  • char hat doch den Wertebereich -127 - 127, oder etwa nicht?
    Und ja, es kommt 44 raus, da habe ich mich wohl vertippt, entschuldige 🙂

    Warum aber 44 rauskommt, ist mir nicht klar 😕


  • Mod

    niksch schrieb:

    char hat doch den Wertebereich -127 - 127, oder etwa nicht?

    Nein, nicht unbedingt. 0 bis 255 ist auch noch üblich. Und beides ist keine Pflicht, es darf auch größer sein. Lass dir mal die Werte CHAR_MIN und CHAR_MAX (definiert in limits.h) anzeigen.

    Warum aber 44 rauskommt, ist mir nicht klar 😕

    44 ist 300 % 256. Oder auch 300 % 128. Welches von beiden das gesuchte ich, hängt davon ab, wie genau die chars definiert sind. Und falls es signed chars sind, ist das Ergebnis strng genommen sogar undefiniert.



  • niksch schrieb:

    char hat doch den Wertebereich -127 - 127, oder etwa nicht?

    Das ist wahrscheinlich richtig. SeppJ hat es ja eigentlich schon erklärt, aber trotzdem noch ein paar Fragen, damit du selbst drauf kommst:

    - Wertebereich char? (Antwort schon gegeben: -128 bis 127)
    - Was ist 30*10
    - Passt das Ergebnis in ein char?
    - Was ist ein Überlauf?



  • Ah, ok!
    Vielen Dank für die ausführlichen Antworten, mir war nicht bekannt wie sich der Überlauf ergibt. Aber nun ist auch das klar.

    Danke sehr und einen schönen Tag noch!



  • Bei 8-Bit char und Zweierkomplement hat char i.A. einen Wertebereich von -128 bis +127.
    Das sind 128 negative Zahlen und 128 (mit der 0) positive Zahlen.
    Das ergibt dann die 256 verschiedene Zustände die 8-Bit aufnehmen können.

    Oder es hat eben den Wertebereich von 0 bis 255, was auch 256 verschiedene Zustände sind.


Anmelden zum Antworten