C++ Fragen zu Datentypen

H

hobbicon

Gast
Ich lerne gerade für die C++ Klausur und hätte einige Fragen...

....bzgl. Datentypen:

  1. Warum ist 1E6 vom Typ double und nicht int? 1E6 bedeutet doch 1.0*10^6= 1000000
  2. Warum ist ein "0" ein string und kein char? Weiß ich jetzt selbst, wegen dem ""
  3. Warum ist 0.5 float und kein double?
  4. Warum ist ´ 0´ ein char und kein string?
  5. Hexadezimalzahlen wie 0xABC kann ich schlecht im Kopf ausrechnen, woher weiß ich, ob es sich um ein int oder long handelt?


.....bzgl Rechnen mit Datentypen:

  1. Was bedeutet ´ a´+1? Ein char + int ?
 
1. int ist begrenzt bis glaube ich 32.000

3. int, double und wie sie alle heissn sind nur für ganzzahlige Zahlen
float für Zahlen mit Nachkommastellen

4. ka
5. ka
 
MegaPaulBlart schrieb:
1. int ist begrenzt bis glaube ich 32.000

3. int, double und wie sie alle heissn sind nur für ganzzahlige Zahlen
float für Zahlen mit Nachkommastellen


4. ka
5. ka

float und double sind für Gleitkommazahlen. Aber warum ist es denn float und kein double? Die sollten sich nur in der Genauigkeit 7 vs 15 Stellen unterscheiden. ich würde für 0.5 eher double nehmen. Aber die Lösung sagt float.
 
4. ist ein char wegen dem '', so wie 2. ein String ist wegen den "".

z.B. 'saf' ist ungültig
 
ok tut mir leid habe ich mich vertan

Double deckt einen nochmals um einiges größeren Bereich ab, also wenn man zum Beispiel weiss, dass man keine zu hohen Zahlen für float hat verwendet man float (um ressourcenschonender zu programmieren ?)
 
Tigerass 2.0 schrieb:
4. ist ein char wegen dem '', so wie 2. ein String ist wegen den "".

z.B. 'saf' ist ungültig

Ja, verstehe.

"saf" wäre als string gültig, aber nicht als char ´ saf´, sondern nur als char ´s´, ´a´und ´f´.
 
Woher hast du denn deine Lösungen? Literale, wie z.B. 0.5 sind eig. vom Typ double - als float-Literal müsste das 0.5f sein. Und bei arithmetischen Operationen auf chars wird der zum Character gehörenden ASCII-Wert benutzt. Also z.B. 'a' + 1 = 98, da der ASCII Wert von 'a' eben 97 ist.
 
Char ist halt nur ein character (ein Zeichen) und ein String ist halt eine Zeichenkette ;-)
 
Konrad Feuer schrieb:
Woher hast du denn deine Lösungen?


Bei der 0,5 muss ich in der Zeile verrutscht sein, da steht ja double....


Vom Lösungsblatt:

8631678Unbenannt.PNG
 
1. Weil die wissenschaftliche Notation double impliziert. Das selbe bei 0.5
http://www.cplusplus.com/doc/tutorial/constants/
Daher ist die Antwort bei 3 nicht float sondern double, was aber kein Unterschied macht, denn beide können es genau darstellen.
5. Das ist gar nix, sondern nur ne Ganzzahl. Wenn int <=> 32 bit und long <=> 64 bit ist, dann kannst du nach den Stellen der Hexzahl gehen. Eine Stelle entspricht 4 bits.
Also ist 0xCAFFEFAC eine int (32 bit)
0xFF80 ein short (16 bit)
0xABC ein short
0xFF ein char (8 bit)

'a'+1 gibt i.d.R. 'b'.
Warum? Da Buchstaben nichts anderes wie Zahlen mit einer Sonderbedeutung sind. Daher kannst du mit ihnen rechnen, aber immer dran denken, der Computer weiß die Sonderbedeutung nicht.

EDIT: Bin mal wieder zu spät dran ^^.

EDIT2:
(a) const char [7]
(j) const char [3]
 
Zuletzt bearbeitet:
Also die Lösungen sind merkwürdig.

0,5 ist eindeutig double, wie schon erwähnt wurde müsste es mit einem "f" am Ende (also 0,5f) gekennzeichnet werden.

siehe auch Lösung/Aufgabe "n".
 
Die Lösung stimmt. Notationen mit E sind nunmal für Gleitkommazahlen reserviert. Auch Hex und Oktalzahlen sind, wie alle anderen Ganzzahlen eben vom Typ int, es sei denn du stellst ein L hinten an, was das Literal als Long klassifizieren würde. Keine Ahnung, wie der verwendete C++ Compiler int oder long Literale bearbeiten würde, die über die Grenzen hinweg gehen, aber ich vermute mal, mittels Überlauf.
 
1)
Die E-Notation ist die "exponentielle Notation" womit man halt auch 1e-2 schreiben kann, wass dann 0,01 bedeuten würde - also ist double die beste Wahl.

2)
Wenn Du eine char haben willst, musst Du '0' schreiben.

3)
In C ist 0.5 automatisch ein double. Wenn man dort nur ein float haben will, muss man explizit 0.5f schreiben. Ich würde sagen, das ist in C++ immer noch so.

4)
Das ist in C/C++ halt so definiert - vielleicht einfach mal ein Handbuch kaufen?

5)
Ein int (in 32bit Systemen) entspricht 32 Bit, 4 Byte oder 8 Nibbles. 1 Nibble ist 1/2 Byte oder eine Stelle in der 0x-Notation - 0x# <= 1 Nibble.

Daraus folgt, alles mit weniger als 8 Nibbles ist dann wohl ein int, alles darüber ein long.

6)
% ist der Rest nach einer Ganzahldivision, also in Deinem Fall 7.
 
Zuletzt bearbeitet: (erweitert)
http://msdn.microsoft.com/de-de/library/s3f49ktz.aspx

Hier eine kleine Übersicht. Normal wird immer für int =int32 hergenommen. Das ist nämlich nicht eindeutig.

Ich finde jetzt leider die gute Übersicht nimmer.

Gleitkommazahlen(float, double) heißen ja deswegen so, weil sesich aus Vorzeichen(1bit),Mantisse, und Exponent bestehen. Darum muss eine Exponentfunktion immer float oder double sein.

http://msdn.microsoft.com/de-de/library/hd7199ke.aspx

Darum eben 1. ist double oder eben float. Könnte nämlich auch sein. Es müsste nur dann double sein, wenn eben die 8bit für den Exponenten nicht mehr ausreichen also -128....127 oder eben bei der Mantisse die 23bit.

2. " ist immer string. Kann eben auch nur ein Zeichen sein. Nicht vergessen. Ein string ist normal immer null terminiert: Also hat der string intern 2 Zeichen. nämlich am ende noch \0. \0 = nullzeichen zur Terminierung des Strings.

3. C++ versucht immer so wenig Speicher wie möglich zu verwenden. Darum ist 0.5 erst mal float. Wenn Du jetzt double Wert + nem float Wert nimmst, wird das automatisch erweitert.

4. ' ist eben nur für ein Zeichen also char. man darf nicht mehr als ein Zeichen da reinschreiben. '12' ist also falsch. Gibt nen Fehler.

5. um zu erkennen ob das Hexadezimal ein float oder double ist, hängt davon ab wie lange die sind.
Hexadezimal geht von 0....15. um den Wertebereich in Maschinencode also Binärsystem darstellen zu können braucht man 2^4. Also 4 Bits. Das heißt eine Hexadezimalziffer braucht immer 4 bits.

Schreibst Du nun 0xABC hast Du also 3*4 Bits verbraucht. macht 12bits. 8bits = 1byte. Macht also 1,5bytes. Geht also noch locker in ne float rein. Was immer noch wichtig ist. Ob ein Vorzeichen dabei ist. Dann geht nämlich ein Bit fürs Vorzeichen drauf!
 
@Hellsfoul:
3.) Nein, 0.5 ist eine double, kann aber in eine float gecastet werden.
4.) '12' ist 12594, da sieht man die C-Wurzeln, ein Literal ist erstmal ein int und wird dann in ein char gecastet (weil es das ist, was man i.d.R. will). Kann aber auch lustige Ergebnisse bei cout verursachen.
5.) Mit Hexzahlen kannst du kein float oder double initialisieren. Die sind zuerstmal ein int außer man hat es anders angegeben, du kannst sie natürlich bei entsprechendem Wert auch runtercasten auf kleinere Datentypen.
 
MegaPaulBlart schrieb:
1. int ist begrenzt bis glaube ich 32.000

Schmarn. Wie breit (in Bytes) ein int ist (und damit auch der mögliche Wertebereich), hängt vom jeweiligen Compiler ab. Eine gebräuchliche Breite ist 4 Bytes, womit sich der Wertebereich von - 2 Milliarden und a paar Zerquetschte bis + 2 Milliarden und a paar Zerquetschte erstrecken würde.
 
Zurück
Oben