signed char VS. unsigned char ?



  • Hallo!
    Ich grueble schon die ganze Zeit darueber (hab die Suchfunktion + Google richtig heisslaufen lassen) nach, was der Unterschied der beiden ist? Ich komme einfach nicht drauf.

    Ist

    unsigned char c = 255;
    

    denn nicht dasselbe Zeichen wie

    signed char c = 127;
    

    ???

    Weshalb gibt es dann die beiden?

    Ich komm einfach nicht drauf 😞

    Gruss,
    Cartman



  • ich glaub zwar nicht, dass es das selbe Zeichen ist, aber für Zeichen ist unsigned bei char wohl weniger gedacht. Viel eher ist es sinnvoll, wenn man darin eine Zahl speichern will. Mit nem Datentyp der Größe eines Bytes kann man ja durchaus einiges mehr anfangen.



  • je nach compiler gibt es eine implementation von byte oder eben nicht, ein byte ist bei den anderen meist nichts anderes als ein unsigned char, wenn du es auf der konsole ausgibst, sollte dennoch dasselbe textzeichen stehen ...

    ALLERDINGS ist unsigned 255 != signed 127

    unsigned 255 = signed -1 !!!!
    er zählt erst ganzgewöhnlich binär 0 = signed wie, unsigned 0
    der überschlag kommt nach 127, wenn das MSB bei 128 zur 1 wird, schlägt er um auf -126 und zählt dann "quasi" rückwärts bis -1 = 255 und schlägt dann auch 0 bei beiden auch wieder auf 0 um

    oder steh ich eben aufm schlauch ???? ich sollte mal wieder mehr in c schreiben und nicht in java, da gibts kein unsigned XD



  • char ist für Zeichen, signed char und unsigned char sind für Zahlen, so wie signed int und unsigned int, nur eben mit anderem Wertebereich.

    Ceos schrieb:

    unsigned 255 = signed -1 !!!!
    er zählt erst ganzgewöhnlich binär 0 = signed wie, unsigned 0
    der überschlag kommt nach 127, wenn das MSB bei 128 zur 1 wird, schlägt er um auf -128 und zählt dann "quasi" rückwärts bis -1 = 255 und schlägt dann auch 0 bei beiden auch wieder auf 0 um

    Das gilt aber nur, wenn negative Zahlen im 2er-Komplement dargestellt werden, was dir vom Standard aber nicht garantiert wird.



  • Danke fuer die Aufklaerung 🙂
    Also spielt es keine Rolle ob man signed char oder unsigned char nimmt - ausser wenn man mit den ASCII-Werten arbeitet. Da sollte man char-Variablen immer als signed char oder unsigned char deklarieren, da es vom Compiler abhaengig ist ob char jetzt unsigned oder signed ist.

    Sehe ich das so richtig?



  • ich würde NUR char schreiben, das macht defakto mehr sinn, da es "eigentlich" der standard für character ist ... und der compiler sich dann aussuchen sollte was er nimmt ... aber den einwurf mit dem 2erkomplement sollte man auch nciht verachten, falls du mal mit chars (zeichen) rechnen willst, immer vorher in das gewünschte format konvertieren, jeder compiler sollte dir dann am ende das signed oder unsigned nachm cast geben, egal ob seine chars nun signed sinn oder nicht ....

    ich mag c# und java, java hat keine unsigned werte und c# verwendet byte statt char für 1 byte lange werte und char werden da auch als echte unicode character gespeichert, mit 2 byte größe



  • java hat keine unsigned werte

    Irgendwie das häufigste Argument für Java... dass es etwas NICHT hat.



  • Ceos schrieb:

    char werden da auch als echte unicode character gespeichert, mit 2 byte größe

    Dumm nur, dass 2 Byte nicht reichen, um alle Unicode-Zeichen darzustellen. 😃



  • signed ist besser



  • Eine beliebige feste Anzahl von Bytes reicht niemals um jedes Unicode-Zeichen darzustellen.



  • Decimad schrieb:

    Eine beliebige feste Anzahl von Bytes reicht niemals um jedes Unicode-Zeichen darzustellen.

    63452945234834512893253 reichen auf jeden fall



  • .... mehr als 512 kB....



  • Decimad schrieb:

    Eine beliebige feste Anzahl von Bytes reicht niemals um jedes Unicode-Zeichen darzustellen.

    Warum? Weil theoretisch irgendwann mal mehr als 2^32 Zeichen definiert sein könnten?



  • Weil man mehrere Codepunkte zu einem Zeichen zusammensetzen kann (oder muss, je nachdem).



  • Decimad schrieb:

    Weil man mehrere Codepunkte zu einem Zeichen zusammensetzen kann (oder muss, je nachdem).

    Verstehe. Warum man für ein Character 2 Bytes nutzen sollte, erklärt es aber trotzdem nicht.



  • Ich muss die Stelle übersehen haben, an der du diese Frage aufgeworfen hast.



  • Eric Cartman schrieb:

    Hallo!
    Ich grueble schon die ganze Zeit darueber (hab die Suchfunktion + Google richtig heisslaufen lassen) nach, was der Unterschied der beiden ist?

    Je nach Pattform wird für char entweder der signed char oder unsigned char Typ verwendet. Da die ISO Norm garantiert, daß man alle problemlos zuweisen kann, und sich das Zeichen nicht ändert (nur dessen Zeichencode), ist es schlußendlich egal, welches Typ Du für Deine eigenen Programme verwendest.



  • Decimad schrieb:

    Ich muss die Stelle übersehen haben, an der du diese Frage aufgeworfen hast.

    Es ging um Ceos' Aussage über die 2 Byte großen "echten" unicode characters von Java und C#. Klingt für mich so, als hielte er sie für einen Vorteil.



  • wenns nach vorteil klingt tuts mir leid cih finds eher verwirrend für umsteiger, aber ich finde die byte deklaration ist ein eindeutiger vorteil!
    wieso verdammt nochmal es kein word in c# gibt versteh ich allerdings nicht ...
    die klassischen byte word doubleword und quadword wären doch ideal um als unsigned werte herzuhalten, weil man sie im speicher auch nciht ander zu interpretieren hat

    EDIT: die integer sind ja auch endlose gummibänder, ich sag nur In16 - Int64 in c# ... herr sprich ein "word" aufdass die "double" zum "quad" werden ... SCNR iss schon spät



  • ~john schrieb:

    Eric Cartman schrieb:

    Hallo!
    Ich grueble schon die ganze Zeit darueber (hab die Suchfunktion + Google richtig heisslaufen lassen) nach, was der Unterschied der beiden ist?

    Je nach Pattform wird für char entweder der signed char oder unsigned char Typ verwendet. Da die ISO Norm garantiert, daß man alle problemlos zuweisen kann, und sich das Zeichen nicht ändert (nur dessen Zeichencode), ist es schlußendlich egal, welches Typ Du für Deine eigenen Programme verwendest.

    "char" ist weder "signed char" noch "unsigned char", das sind drei unterschiedliche Typen. Allerdings wird sich char wohl immer entweder genau wie signed char oder genau wie unsigned char verhalten -- falls du das gemeint haben solltest.

    Ich denke bei char gibt es die drei getrennten Typen, damit man z.B. "char-zeiger/arrays" einfach immer als Text interpretieren kann. Denn: wer rechnen will, der kann bzw. soll einfach "signed char" oder "unsigned char" nehmen.

    Beispiel:

    #include <iostream>
    
    template <class T> void foo(T const& t)
    {
    	std::cout << typeid(T).name() << " " << t << std::endl;
    }
    
    int main()
    {
    	char c = 'X';
    	signed char sc = c;
    	unsigned char uc = c;
    
    	foo(c);
    	foo(sc);
    	foo(uc);
    
    	int i = 123;
    	signed int si = i;
    	unsigned int ui = i;
    
    	foo(i);
    	foo(si);
    	foo(ui);
    }
    /* output:
    
    char X
    signed char X
    unsigned char X
    int 123
    int 123
    unsigned int 123
    */
    

    Sogesehen verhält sich char genauso wie wchar_t: auch wenn wchar_t sich z.B. genau gleich wie ein "unsigned short" verhält, darf wchar_t niemals der selbe Typ wie "unsigned short" sein.


Anmelden zum Antworten