2015-10-02 12 views
16

Ich habe ein Problem herauszufinden, warum die Ausgabe in jedem dieser besonderen Fälle unterschiedlich ist. In dem Beispielcode ein, gibt es eine variable Förderung, wie ich erwarte, und das Ergebnis es > 6 ist, aber in dem Beispielcode b, ist das Ergebnis <= 6:Variable Förderung in C

/* **Code a** */ 
puts("Code a\n"); 
unsigned int a = 6; 
int b = -20; 
(a+b > 6) ? puts("> 6\n") : puts("<= 6\n"); 

/* **Code b** */ 
puts("Code b:\n"); 
uint8_t a1 = 6; 
int8_t b1 = -20; 
(a1+b1 > 6) ? puts("> 6\n") : puts("<= 6\n"); 

Ausgang:

Code a 

> 6 

Code b: 

<= 6 
+0

Werfen Sie einen Blick auf: [In einem C-Ausdruck, in dem unsigned int und signed int vorhanden sind, welcher Typ wird zu welchem ​​Typ hochgestuft?] (Http://stackoverflow.com/questions/2280663/in-ac-expression -where-unsigned-int-and-signed-int-sind-Präsens-welcher-Typ wird) Ich hoffe, dass dir das weiterhilft. – Missu

+0

Ein Bild für Textausgabe bereitstellen? Das wird automatisch geladen, wenn einige diese Frage öffnen? Haben Sie einen Tracker dahinter?) Bitte verwenden Sie in solchen Fällen nur Ausschneiden und Einfügen. –

+5

Ein schönes Beispiel für einen einfachen, aber wohlgeformten Post: Klare Überschrift, klare Schwierigkeitsangabe, Beispielcode, Ausgabe, erwartete Ausgabe, gute Tags. – chux

Antwort

9

die übliche an den Operanden der Addition werden arithmetische Umwandlungen durchgeführt. Bei Integer-Typen besteht dies bei Bedarf aus Integer-Promotions, und wenn die beiden Operanden nicht den gleichen Typ haben, wird eine weitere Konvertierung durchgeführt, um sie auf einen gemeinsamen Typ zu bringen.

Im ersten Fall gibt es keine Aktionen, aber die int Operanden zu unsigned int umgewandelt, weil int nicht alle möglichen Werte von unsigned int halten kann.

Im zweiten Fall werden beide Operanden auf int hochgestuft und bleiben als int erhalten, da sie einen gemeinsamen Typ haben.

Als Referenz der Entwurf C11-Standard in Abschnitt 6.5.6Additive Operatoren sagt:

Wenn beide Operanden arithmetischen Typ haben, die üblichen arithmetischen Umwandlungen auf sie durchgeführt werden.

Abschnitt 6.3.1.8 Übliche arithmetische Umwandlungen sagt:

Viele Operatoren, die Operanden der arithmetischen Typ Ursache Umsätze und Ertrag Ergebnisarten in ähnlicher Weise erwarten. Der Zweck ist einen gemeinsamen realen Typ für die Operanden und Ergebnis zu bestimmen. Bei den angegebenen Operanden wird jeder Operand ohne Änderung des Typs Domäne in einen Typ konvertiert, dessen entsprechender realer Typ der gemeinsame reale -Typ ist. Sofern nicht explizit anders angegeben, ist der gemeinsame Realtyp auch der entsprechende Realtyp des Ergebnisses, dessen Typ domain die Typdomäne der Operanden ist, wenn sie gleich sind, und ansonsten komplex . Dieses Muster wird die üblichen arithmetischen Umwandlungen

genannt [...]

Ansonsten ist die Integer-Aktionen auf beiden Operanden durchgeführt werden. Dann werden die folgenden Regeln für die Operanden angewendet gefördert

[...]

  • Andernfalls, wenn der Operand, unsigned integer Typ hat hat Rang größer oder gleich dem Rang des Typs, der andere Operand, dann wird der Operand mit signierten integer-Typ auf den Typ des Operanden mit unsigned integer-Typ umgewandelt wird

[...]

Eine gute Referenz für die Begründung dafür finden Sie in der Frage: Why must a short be converted to an int before arithmetic operations in C and C++?.

+0

Es macht jetzt vollkommen Sinn. Danke – Lal0ver

+0

Sowohl die "Integer Promotions" als auch die Konvertierungen, die benötigt werden, um die Operanden auf einen gemeinsamen Typ zu bringen, sind Teil der "üblichen arithmetischen Konvertierungen". Siehe [N1570] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) 6.3.1.8. –

+0

@KeithThompson hmmm, ich wollte es nicht anders klingen, aber ich kann sehen, wie es so aussieht. –