char und wchar_t & long und int
-
Hallo zusammen,
ich weiß, dass der Typ char einen Byte im Arbeitsspeicher reserviert (oder?) und ich kann somit einem char genau einen Buchstaben zuweisen (außer im Array).Nun habe ich den Typ wchar_t kennengelernt. Mittels sizeof habe ich erfahren, dass er zwei Byte benötigt. Was kann man damit genau machen? Soweit ich weiß, kann man damit auch asiatische Zeichen darstellen. Wie kann ich das genau machen und was ist der Vorteil. Kann ich damit auch ä, ü und ö darstellen?
Außerdem frage ich mich, warum ich mittels sizeof eine gleich Größe für int und für long ermittel. Ich dachte, dass int zwei Byte und long vier Byte braucht (da long ja auch viel größer ist). Auf verschiedenen Internetseiten steht das auch, aber "mein" sizeof sagt da was anderes.
Vielen Dank
lg, freakC++
-
int und long sind auf einem 32-Bit-System und z.B. MS-C++-Compiler gleichgroß. Ein int mit 2 Bytes hat man wohl höchstens zu 16-Bit-Zeiten gesehen. Hier gibts ne schöne Übersicht:
http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx
Und zum Thema wchar_t: google am besten mal nach Unicode und MBCS und lies dir das alles mal in Ruhe durch.
-
Hey,
vielen Dank für die ANtwort. Ich habe zwar schon google durchforstet, aber ich denke, dass ich es nocheinmal machen könnte
Vielen Dank
lg, freakC++
-
Grundsätzlich ist vieles Implementierungsabhängig. Es gelten jedoch die folgenden Regeln:
Ganz allgemein für die integralen Werte.
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)Wobei
shorteinshort intist undlongeinlong int. Gleiches gilt auch für die explizitensigned, bzw.unsignedTypen.charkann überigens per defaultunsignedodersignedsein, beides ist erlaubt. Einshortist allerdings immer einsigned short int, einintimmer einsigned intund einlongimmer einsigned long int.boolentspricht einfach einem integralen Wert. Dies kann voncharbislongalles sein, allerdings gibt es hier wedersignednochunsigned.
1 <= sizeof(bool) <= sizeof(long)Ein
wchar_tentspricht auch einfach einem integralen Wert. Er übernimmt alle dessen Eigenschaften.
sizeof(char) <= sizeof(wchar_t) <= sizeof(long)Dann gibt es noch die Definition für die Floating Point Werte:
sizeof(float) <= sizeof(double) <= sizeof(long double)Zudem gibt es glaub ich verstreut über den Standard die Bedeutung, dass ein
charmindestens 8 Bits haben muss, einshortmindestens 16 und einlongmindestens 32.Das ist somit alles, was der Standard vorschreibt. Es erlaubt eine vielzahl an Variationen bei den Kompilern und Platformen. Für den MSVC und die x86 Platform hat dir _matze bereits einen Link gegeben, allerdings sei dir bewusst, dass dies nur in dieser Kombination der Fall ist.
Ein typisches Beispiel für unterschiedliches Verhalten über bekannte Betriebsysteme und Kompiler hinweg ist der Typ
wchar_t. Auf Windows und MSVC ist wchar_t 2 Bytes gross. Auf Linux und GCC ist er 4 Bytes gross.
Auf Windows verwendet manwchar_tum UCS-2 oder UTF-16 zu speichern, auf Linux verwendet manwchar_tum UCS-4 oder UTF-32 zu speichern.Mit diesen Stichwörtern, vor allem UTF (Unicode Transformation Format), solltest du per Wikipedia und einer Suchmaschine deiner Wahl viele Seiten finden. Gibt auch Themen hier im Forum. Von Artchi gibt es auch noch ein Wiki Eintrag auf seiner Seite:
http://www.kharchi.eu/wiki/doku.php?id=cpp:std:stringDas Thema ist recht komplex, vor allem weil C++ keine standardisierte Unterstützung für Unicode hat, welche sich allerdings mit dem nächsten Standard etwas verbessern wird.
Grüssli
PS:
std::wcoutfunktioniert meistens nicht so, wie man es möchte, davon bloss nicht verwirren lassen. Das ist meisten ein Problem der Konsolen.
-
Hallo Dravere,
vielen Dank für diese super Antwort. Hat mir echt geholfen.
Bis bald
lg, freakC++
-
Dravere schrieb:
charkann überigens per defaultunsignedodersignedsein, beides ist erlaubt.Stimmt so nicht ganz, bzw. liest sich etwas ungenau. Man kann deinen Satz so verstehen, als gäbe es signed char und unsigned char, und char ist eines von beidem. Tatsächlich ist laut Standard char aber weder das eine noch das andere, sondern ein dritter Datentyp, der lediglich im Wertebereich mit einem der beiden anderen übereinstimmt. Ebenso ist wchar_t ein eigener Datentyp, dessen Wertebereich aber häufig (oder immer? bin nicht ganz sicher) mit short übereinstimmt.
-
pumuckl schrieb:
Stimmt so nicht ganz, bzw. liest sich etwas ungenau. Man kann deinen Satz so verstehen, als gäbe es signed char und unsigned char, und char ist eines von beidem. Tatsächlich ist laut Standard char aber weder das eine noch das andere, sondern ein dritter Datentyp, der lediglich im Wertebereich mit einem der beiden anderen übereinstimmt.
Oder um es ganz eindeutig zu machen:
C++ Standard 14882:2003, 3.9.1 in Abschnitt 1 schrieb:
It is implementation-defined whether a char object can hold negative values. Characters can be explicitly declared unsigned or signed. Plain char, signed char, and unsigned char are three distinct types. A char, a signed char, and an unsigned char occupy the same amount of storage and have the same alignment requirements (3.9); that is, they have the same object representation.
pumuckl schrieb:
Ebenso ist wchar_t ein eigener Datentyp, dessen Wertebereich aber häufig (oder immer? bin nicht ganz sicher) mit short übereinstimmt.
wchar_tist ein eigener Datentyp ja, aber dass er häufig mitshortübereinstimmen soll, wäre mir ganz neu. Oder istshortauf Linux 4 Bytes? Soweit ich mich erinnere nicht ...Grüssli