Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C (C89, C99 und C11) ::  Rechnung mit char Daten     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
niksch
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.03.2012
Beiträge: 3
Beitrag 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
Beitrag _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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag _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
Beitrag 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




Beitrag 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.
c++.de :: C (C89, C99 und C11) ::  Rechnung mit char Daten   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.