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++


  • Administrator

    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 short ein short int ist und long ein long int . Gleiches gilt auch für die expliziten signed , bzw. unsigned Typen. char kann überigens per default unsigned oder signed sein, beides ist erlaubt. Ein short ist allerdings immer ein signed short int , ein int immer ein signed int und ein long immer ein signed long int .

    bool entspricht einfach einem integralen Wert. Dies kann von char bis long alles sein, allerdings gibt es hier weder signed noch unsigned .
    1 <= sizeof(bool) <= sizeof(long)

    Ein wchar_t entspricht 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 char mindestens 8 Bits haben muss, ein short mindestens 16 und ein long mindestens 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 man wchar_t um UCS-2 oder UTF-16 zu speichern, auf Linux verwendet man wchar_t um 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:string

    Das 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::wcout funktioniert 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:

    char kann überigens per default unsigned oder signed sein, 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.


  • Administrator

    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_t ist ein eigener Datentyp ja, aber dass er häufig mit short übereinstimmen soll, wäre mir ganz neu. Oder ist short auf Linux 4 Bytes? Soweit ich mich erinnere nicht ...

    Grüssli


Anmelden zum Antworten