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
?
-
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, entschuldigeWarum aber 44 rauskommt, ist mir nicht klar
-
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.