unsigned char



  • Hallo zusammen,

    warum werden manchmal Zeichen vom Daten-Typ unsigned char definiert. für mich macht es unsigned char keinen sinn im Gegensatz zu zahlen.
    veilleicht hat ja jemand eine Erklärung.

    vielen Dank



  • ganz einfach:

    (singed) char = -127 bis +126
    unsigned char = 0 bis +255

    der ascii-zeichensatz geht bis 255^^. mit einem signed char würde die sache bei zeichen > 127 einfach negativ werden, wird zwar eigl vom compiler dann intern zu unsigned gecastet, trotzdem ist eine explizite deklaration an solchen stellen besser.



  • Wenn du signierte Datentypn benutzt, z.b. 'char', dann wird das höherwertigste Bit für das Vorzeichen verwendet. Die Zahlen sind dann in der Zweierkomplement Darstellung und daraus folgt, dass der Wertebereich einer 'char' Variable zwischen -128 und 127 liegt.

    Mit 8 Bits kannst du aber 256 Zahlen darstellen. Im Falle eines signierten 'char's kannst du 128 negativen, die 0 und 127 positiven Zahlen darstellen (128+1+127=256). Angenommen du willst Zahlen mit nur 8 Bits darstelle, die größer sind als 127 und dir sind dabei negative Zahlen egal. Im diesem Fall kannst du eine 'unsigned char' Variable nehmen. Das teilt dem Compiler mit, dass das höherwertigste Bit nicht als Vorzeichenbit interpretiert werden muss, somit verändert sich der Wertebereich der 'unsigned char': du kannst nun Zahlen zwischen 0 und 255 darstellen.

    Wann du signed oder unsigned nimmst, hängt vom Zusammenhang ab, in dem die Variablen benötigt wird.



  • TrommlBomml schrieb:

    ...wird zwar eigl vom compiler dann intern zu unsigned gecastet...

    wieso denn das?
    🙂



  • für den compiler ist ein char intern eine 8bit block egal ob signed oder nich:)



  • BorisDieKlinge schrieb:

    für den compiler ist ein char intern eine 8bit block egal ob signed oder nich:)

    das stimmt genau so wenig.



  • Wenn man unterstellen möchte, das ein Byte aus 8 Bits besteht, stimmt's.

    cheers, Swordfish



  • Swordfish schrieb:

    Wenn man unterstellen möchte, das ein Byte aus 8 Bits besteht, stimmt's.

    das ja, aber es kann ihm nicht egal sein, ob's signed oder unsigned ist.
    🙂



  • Außerdem beschränkt sich der ASCII Zeichensatz auf 128 Zeichen und ein char kann durchaus größer sein als 8 Bit. :p



  • David_pb schrieb:

    Außerdem beschränkt sich der ASCII Zeichensatz auf 128 Zeichen und ein char kann durchaus größer sein als 8 Bit. :p

    Jo, kleiner würde auch gehen. Aber ein char hat IMMER ein Byte. 🤡

    Aber ich glaube, er wollte wissen, wieso char (also Character=Zeichen) unsigned und signed sein kann.
    Der Name ist einfach doof. Char ist eigentlich ein integraler Typ wie jeder andere auch. Er muss signed und unsigned sein dürfen, eine feste Menge an einehmbaren Zuständen haben und zu jedem Zustand muss es einen eindeutigen Vorgänger und einen eindeutigen Nachfolger geben.
    Ob char signed oder unsigned ist, hängt von der Implementierung des Compilers ab.
    Der Standard sagt zu integralen Typen folgendes:

    ISO/IEC 9899:TC2 schrieb:

    For each of the signed integer types, there is a corresponding (but different) unsigned
    integer type (designated with the keyword unsigned) that uses the same amount of
    storage (including sign information) and has the same alignment requirements.



  • Tachyon schrieb:

    Ob char signed oder unsigned ist, hängt von der Implementierung des Compilers ab.

    Oder dessen Konfiguration (bzw. deines Makefiles) 😉


Anmelden zum Antworten