signed char VS. unsigned char ?



  • 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