(un)signed char



  • Hallo,

    ich war bisher der Auffassung (und "Die C++-Programmiersprache" hat mich darin gerade auch bestärkt), dass ein 'char' abhängig von der Implementierung entweder ein 'signed char' oder ein 'unsigned char' ist.

    Offensichtlich ist das aber zumindest im VC 8.0 nicht der Fall, wie folgender Code illustiert:

    #include <iostream>
    
    void test(char const&) { std::cout << "char" << std::endl; }
    
    void test(unsigned char const&) { std::cout << "unsigned char" << std::endl; }
    
    void test(signed char const&) { std::cout << "signed char" << std::endl; }
    
    int main()
    {
        char ca = 'R';
        unsigned char cb = 'R';
        signed char cc = 'R';
    
        test(ca);
        test(cb);
        test(cc);
    }
    

    Die Ausgabe davon ist

    char
    unsigned char
    signed char
    

    Das wundert mich, ich dachte bisher, 'char' sei intern einfach ein Typenalias für 'signed char' bzw. 'unsigned char'.

    Wenn man den obigen Code mit 'int' statt mit 'char' schreib, gibt es übrigens, wie ich auch erwartet hätte, einen Fehler, dass die Funktion für 'int' doppelt definiert sei. D.h. 'int' ist sehr wohl dasselbe wie 'signed int'. Wieso ist das bei 'char' nicht so? Was sagt der Standard dazu? Ist das vielleicht nur ein Fehler im VC?



  • Das Thema haben wir hier regelmäßig. Es sind drei verschiedene Typen, der VC hat Recht. Aber das Zitat, was dem im Stroustrup widerspricht, würde mich mal interessieren.



  • Konrad Rudolph schrieb:

    Hallo,

    ich war bisher der Auffassung (und "Die C++-Programmiersprache" hat mich darin gerade auch bestärkt), dass ein 'char' abhängig von der Implementierung entweder ein 'signed char' oder ein 'unsigned char' ist.

    'char' ist laut Standard immer ein eigener Typ, der entweder mit 'signed char' oder mit 'unsigned char' den selben Wertebereich hat (diese Auswahl wird der Implementierung überlassen).

    (im Gegensatz dazu ist 'int' wirklich eine Kurzform für 'signed int' (bzw. 'long'=='signed long int') - warum der Standard für char eine Sonderstellung definiert hat, interessiert mich aber auch)



  • Bashar schrieb:

    Das Thema haben wir hier regelmäßig.

    Oh. Ich hätte gar nicht gedacht, dass das im Alltag auffällt. Ich wäre nie darauf gekommen, wenn mir nicht eine Bibliothek mit Tag dispatching ausgeflippt wäre.

    Aber das Zitat, was dem im Stroustrup widerspricht, würde mich mal interessieren.

    Na, es war schon von mir hineininterpretiert. Auf Seite 78 dt. Ausgabe steht:

    Stroustrup schrieb:

    Die Möglichkeit, einen char in ein int zu konvertieren wirft die Frage auf, ob ein char vorzeichenbehaftet … oder vorzeichenlos … ist. […] Leider ist diese Entscheidung … implementierungsabhängig …. C++ enthält zwei Typen, für die diese Antwort eindeutig ist: […]

    Allerdings stimmt es, er redet hier implizit von drei Typen.


Anmelden zum Antworten