Trigraphen fielen
Quelldateien werden in einem physischen Zeichensatz codiert, der implementierungsdefiniert dem im Standard definierten Quellzeichensatz zugeordnet wird. Um Zuordnungen von einigen physischen Zeichensätzen zu berücksichtigen, die nicht die gesamte vom Quellzeichensatz benötigte Interpunktion hatten, definierte die Sprache Trigraphen - Sequenzen von drei gemeinsamen Zeichen, die anstelle eines weniger gebräuchlichen Interpunktionszeichens verwendet werden könnten. Der Präprozessor und der Compiler mussten diese verarbeiten.
In C ++ 17 wurden Trigraphen entfernt. Daher werden einige Quelldateien von neueren Compilern nur akzeptiert, wenn sie zuerst vom physischen Zeichensatz in einen anderen physischen Zeichensatz übersetzt werden, der dem Quellzeichensatz eins zu eins zugeordnet ist. (In der Praxis haben die meisten Compiler die Interpretation von Trigraphen nur optional gemacht.) Dies ist keine subtile Verhaltensänderung, sondern eine grundlegende Änderung, die verhindert, dass zuvor akzeptable Quelldateien ohne einen externen Übersetzungsprozess kompiliert werden.
Weitere Einschränkungen für char
Der Standard bezieht sich auch auf den Ausführungszeichensatz , der implementierungsdefiniert ist, jedoch mindestens den gesamten Quellzeichensatz sowie eine kleine Anzahl von Steuercodes enthalten muss.
Der C ++ - Standard, der char
als möglicherweise vorzeichenloser Integraltyp definiert ist und jeden Wert im Ausführungszeichensatz effizient darstellen kann. Mit der Darstellung eines Sprachrechtsanwalts können Sie argumentieren, dass a char
mindestens 8 Bit sein muss.
Wenn Ihre Implementierung einen vorzeichenlosen Wert für verwendet char
, wissen Sie, dass dieser zwischen 0 und 255 liegen kann und daher zum Speichern jedes möglichen Bytewerts geeignet ist.
Wenn Ihre Implementierung jedoch einen signierten Wert verwendet, stehen Optionen zur Verfügung.
Die meisten würden das Zweierkomplement verwenden, was char
einen Mindestbereich von -128 bis 127 ergibt. Das sind 256 eindeutige Werte.
Eine andere Option war Vorzeichen + Größe, wobei ein Bit reserviert ist, um anzuzeigen, ob die Zahl negativ ist, und die anderen sieben Bits die Größe angeben. Dies würde char
einen Bereich von -127 bis 127 ergeben, was nur 255 eindeutigen Werten entspricht. (Weil Sie eine nützliche Bitkombination verlieren, um -0 darzustellen.)
Ich bin nicht sicher , dass der Ausschuß immer dies als Mangel ausdrücklich bezeichnet, aber es war , weil Sie nicht auf dem Standard verlassen konnten eine Hin- und Rückfahrt zu gewährleisten , von unsigned char
zu char
und würde wieder den ursprünglichen Wert erhalten. (In der Praxis haben alle Implementierungen dies getan, weil sie alle das Zweierkomplement für vorzeichenbehaftete Integraltypen verwendeten.)
Erst kürzlich (C ++ 17?) Wurde der Wortlaut festgelegt, um eine Rundauslösung zu gewährleisten. Dieser Fix, zusammen mit allen anderen Anforderungen an char
, schreibt effektiv das Zweierkomplement für signierte char
Zeichen vor, ohne dies ausdrücklich zu sagen (auch wenn der Standard weiterhin Vorzeichen + Größenrepräsentationen für andere signierte Integraltypen zulässt). Es gibt einen Vorschlag, wonach alle signierten Integraltypen das Zweierkomplement verwenden müssen, aber ich kann mich nicht erinnern, ob es in C ++ 20 geschafft hat.
Dies ist also genau das Gegenteil von dem, wonach Sie suchen, da es zuvor falschen, übermäßig anmaßenden Code eine rückwirkende Korrektur gibt.