Frage

Ich habe mich immer gefragt, warum die C ++ Standardbibliothek hat basic_ instanziiert [io] Strom und all seine Varianten den char Typen anstelle von dem unsigned char Typ. char Mittel (je nachdem, ob es signiert ist oder nicht), können Sie für Operationen wie get Über- und Unterlauf haben (), die auf die Implementierung definierte Wert der beteiligten Variablen führen. Ein anderes Beispiel ist, wenn Sie ausgeben wollen einen Byte, unformatiert, zu einem Ostream seiner put Funktion.

Irgendwelche Ideen?


Hinweis : Ich bin immer noch nicht wirklich überzeugt. Also, wenn Sie die endgültige Antwort wissen, können Sie es in der Tat stellen.

War es hilfreich?

Lösung

Vielleicht habe ich die Frage falsch verstanden, aber Umwandlung von unsigned char zu char ist nicht nicht spezifiziert, es ist abhängig von der Implementierung (4.7-3 in dem C ++ Standard).

Der Typ eines 1-Byte-Zeichen in C ++ ist "char", nicht "unsigned char". Dies gibt Implementierungen ein bisschen mehr Freiheit, das Beste, was auf der Plattform (zum Beispiel die Normungsorganisation angenommen, kann hat, dass es CPUs existiert, in denen signierte Byte-Arithmetik schneller als ohne Vorzeichen Byte-Arithmetik ist, aber das ist Spekulation meinerseits) zu tun. Auch für die Kompatibilität mit C. Das Ergebnis der Beseitigung dieser Art von existenzieller Unsicherheit von C ++ ist C #; -)

Da der „char“ Typ vorhanden ist, ich denke, es macht Sinn für die üblichen Ströme, es zu benutzen, obwohl seine Signedness nicht definiert ist. Also vielleicht Ihre Frage nach der Antwort auf die beantwortet wird, „warum nicht C ++ nur char definieren unsigned zu sein?“

Andere Tipps

Ich habe immer verstanden, es auf diese Weise: der Zweck der iostream Klasse ist einen Strom von Zeichen zu lesen und / oder zu schreiben, die, wenn man darüber nachdenkt, sind abstrakte Gebilde, die durch den Computer nur dargestellt werden, mit einem Charakter Codierung. Die C ++ Standard macht mir große Mühe die Zeichenkodierung zu vermeiden unten feststecken, sagte nur, dass „Objekte als Zeichen (char) erklären groß genug sein muss, jedes Mitglied der Implementierung Grundzeichensatzes zu speichern,“ weil es nicht zu zwingen, braucht die „Umsetzung Grundzeichensatz“, um die C ++ Sprache zu definieren; der Standard kann die Entscheidung von verlassen, die Zeichencodierung für die Umsetzung (Compiler zusammen mit einer STL-Implementierung) verwendet wird, und beachten Sie nur, dass char Objekte einzelne Zeichen in irgendeiner Codierung darstellen.

Eine Implementierung Schriftsteller könnte ein einzelnes Oktett Codierung wie ISO-8859-1 wählen oder auch eine Doppel Oktett Codierung wie UCS-2 . Es spielt keine Rolle. Solange ein char Objekt „groß genug, um jedes Mitglied der grundlegenden Zeichensatzes zu speichern Implementierung“ ist (beachten Sie, dass dies ausdrücklich verbietet variabler Länge Codierungen ), dann kann die Umsetzung auch eine Codierung wählen, die grundlegende Latein in einer Art und Weise darstellt, die mit allen gängigen Codierung nicht kompatibel ist!

Es ist verwirrend, dass die char, signed char und unsigned char Typen in ihrem Namen „char“ teilen, aber es ist wichtig, im Auge zu behalten, die gehören char nicht zur selben Familie von Grundtypen wie signed char und unsigned char. signed char ist in der Familie der signierten Integer-Typen:

  

Es gibt vier Integer-Typ unterzeichnet : "signed char", "short int", "int" und "long int"

und unsigned char ist in der Familie der unsigned Integer-Typen:

  

Für jede der signierten Integer-Typen gibt es einen entsprechenden (aber anders) unsigned Integer-Typen : "unsigned char", "unsigned short int", "unsigned int" und „unsigned long int“...

Die eine Ähnlichkeit zwischen den char, signed char und unsigned char Typen ist, dass „[sie] die gleiche Menge an Speicherplatz belegen und haben die gleichen Ausrichtungsanforderungen“. So können Sie von reinterpret_cast char * um unsigned char * den numerischen Wert eines Zeichens in der Ausführungszeichensatz zu bestimmen.

Um Ihre Frage zu beantworten, den Grund, warum die STL verwenden char als der Standardtyp ist, da der Standard-Streams gedacht ist zum Lesen und / oder Schreiben von Streams von Zeichen, durch char Objekte dargestellt, nicht ganze Zahlen (signed char und unsigned char). Die Verwendung von char gegenüber dem numerischen Wert ist eine Möglichkeit, Anliegen zu trennen.

char ist für Zeichen, unsigned char für rohes Bytes von Daten und signierte Zeichen für, na ja, Daten unterzeichnet.

Standard spezifiziert nicht, wenn mit oder ohne Vorzeichen char wird für die Durchführung des char verwendet werden - es ist Compiler-spezifisch. Es gibt nur, dass die „char“ wird „genug“ sein Zeichen auf Ihrem System zu halten. - Die Art und Weise Zeichen in jenen Tagen waren, was ist, nicht UNICODE

Mit „char“ für Zeichen ist der normale Weg zu gehen. unsigned char zu verwenden ist ein Hack, obwohl es Compiler-Implementierung von char auf den meisten Plattformen übereinstimmen werden.

Ich denke, dieser Kommentar es gut erklärt. Zu zitieren:

  

signed char und unsigned char sind Arithmetik, integrale Typen wie int und unsigned int. Auf der anderen Seite wird char ausdrücklich als die „I / O“ -Typ vorgesehen, die etwas undurchsichtige, systemspezifische grundlegende Einheit der Daten auf Ihrer Plattform darstellt. Ich würde sie in diesem Sinne nutzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top