| Autor |
Nachricht |
niksch
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.03.2012
Beiträge: 3
|
niksch Mitglied
15:45:11 19.03.2012 Titel: |
Rechnung mit char Daten |
Zitieren |
Hallo liebe Community,
ich habe das Forum schon oft besucht, aber nun finde ich leider keine passende Lösung.
es geht um folgendes:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 | #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:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 | #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 |
|
|
|
 |
_matze
Mitglied
Benutzerprofil
Anmeldungsdatum: 31.07.2007
Beiträge: 10645
|
_matze Mitglied
16:01:36 19.03.2012 Titel: |
|
Zitieren |
Welchen Wertebereich hat char? |
_________________ Wie viele atheistische Babys hat man schon aus Versehen - oder gar mit Absicht! - getauft?
|
|
 |
SeppJ
Moderator
Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17910
|
SeppJ Moderator
16:01:48 19.03.2012 Titel: |
|
Zitieren |
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. |
_________________ Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List
Zuletzt bearbeitet von SeppJ am 16:07:10 19.03.2012, insgesamt 2-mal bearbeitet |
|
 |
niksch
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.03.2012
Beiträge: 3
|
niksch Mitglied
16:40:47 19.03.2012 Titel: |
|
Zitieren |
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 :/ |
|
|
|
 |
SeppJ
Moderator
Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17910
|
SeppJ Moderator
16:48:36 19.03.2012 Titel: |
|
Zitieren |
| 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.| Zitat: |
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. |
_________________ Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List
Zuletzt bearbeitet von SeppJ am 16:53:14 19.03.2012, insgesamt 2-mal bearbeitet |
|
 |
_matze
Mitglied
Benutzerprofil
Anmeldungsdatum: 31.07.2007
Beiträge: 10645
|
_matze Mitglied
16:50:43 19.03.2012 Titel: |
|
Zitieren |
| 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? |
_________________ Wie viele atheistische Babys hat man schon aus Versehen - oder gar mit Absicht! - getauft?
Zuletzt bearbeitet von _matze am 18:00:57 19.03.2012, insgesamt 1-mal bearbeitet |
|
 |
niksch
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.03.2012
Beiträge: 3
|
niksch Mitglied
16:55:41 19.03.2012 Titel: |
|
Zitieren |
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! |
|
|
|
 |
DirkB
Unregistrierter
|
DirkB Unregistrierter
17:52:55 19.03.2012 Titel: |
|
Zitieren |
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. |
|
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|