Wenn wir uns die Gründe für den internationalen Standard - Programmiersprachen - C im Abschnitt 6.3.1.8
Übliche arithmetische Konvertierungen ansehen , heißt es ( Hervorhebung meiner in Zukunft ):
Die Regeln im Standard für diese Konvertierungen sind geringfügige Änderungen gegenüber denen in K & R: Die Änderungen berücksichtigen die hinzugefügten Typen und die werterhaltenden Regeln. Es wurde eine explizite Lizenz hinzugefügt, um Berechnungen in einem „breiteren“ Typ als unbedingt erforderlich durchzuführen, da dies manchmal zu kleinerem und schnellerem Code führen kann, ganz zu schweigen von der richtigen Antwort häufiger . Berechnungen können auch in einem "engeren" Typ nach der Als-ob-Regel durchgeführt werden, solange das gleiche Endergebnis erzielt wird. Explizites Casting kann immer verwendet werden, um einen Wert in einem gewünschten Typ zu erhalten
Abschnitt 6.3.1.8 des Entwurfs der C99-Norm behandelt die üblichen arithmetischen Konvertierungen, die auf Operanden arithmetischer Ausdrücke angewendet werden, z. B. Abschnitt 6.5.6 Additive Operatoren lautet:
Wenn beide Operanden vom arithmetischen Typ sind, werden die üblichen arithmetischen Konvertierungen für sie ausgeführt.
Einen ähnlichen Text finden wir auch in Abschnitt 6.5.5 Multiplikative Operatoren . Im Fall eines kurzen Operanden werden zuerst die Ganzzahl- Heraufstufungen aus Abschnitt 6.3.1.1 Boolescher Wert, Zeichen und Ganzzahlen angewendet , der besagt:
Wenn ein int alle Werte des ursprünglichen Typs darstellen kann, wird der Wert in einen int konvertiert. Andernfalls wird es in ein vorzeichenloses int konvertiert.
Diese werden als Integer-Promotions bezeichnet . 48) Alle anderen Typen bleiben durch die ganzzahligen Aktionen unverändert.
Die Diskussion aus dem Abschnitt 6.3.1.1
der Begründung oder des internationalen Standards - Programmiersprachen - C über ganzzahlige Beförderungen ist tatsächlich interessanter. Ich werde b / c selektiv zitieren. Es ist zu lang, um sie vollständig zu zitieren:
Die Umsetzung fiel in zwei große Lager, die als nicht signierte Erhaltung und Werterhaltung charakterisiert werden können .
[...]
Der Ansatz der vorzeichenlosen Aufbewahrung erfordert die Heraufstufung der beiden kleineren vorzeichenlosen Typen auf vorzeichenlose int. Dies ist eine einfache Regel und ergibt einen Typ, der von der Ausführungsumgebung unabhängig ist.
Der werterhaltende Ansatz erfordert das Heraufstufen dieser Typen auf signiertes int, wenn dieser Typ alle Werte des ursprünglichen Typs ordnungsgemäß darstellen kann, und ansonsten das Heraufstufen dieser Typen auf vorzeichenloses int. Wenn also die Ausführungsumgebung short als etwas kleineres als int darstellt, wird unsigned short zu int; Andernfalls wird int ohne Vorzeichen.
Dies kann in einigen Fällen zu unerwarteten Ergebnissen führen, wie das inkonsistente Verhalten der impliziten Konvertierung zwischen vorzeichenlosen und größeren vorzeichenbehafteten Typen zeigt. Es gibt noch viele weitere Beispiele dafür. Obwohl dies in den meisten Fällen dazu führt, dass die Vorgänge wie erwartet funktionieren.
short s=1, t=2; auto x = s+t;
dannx
ist einint
.