2013-06-18 6 views
8

ich versuchte zusammen bool Wert zu schaffen, sagen:Hinzufügen von zwei bool Werte in C/C++

bool i = 0, j = 0, k = 0;
cout << sizeof(i + j + k) << endl;

Das Ergebnis 4 ist, was bedeutet, wird das Ergebnis auf eine 'int' umgewandelt Wert.

Ich möchte fragen: Ist das ein C/C++ Standard-Betrieb? garantiert der Compiler immer, dass der temporäre Wert bei Überlauf in einen größeren Typ konvertiert wird? Vielen Dank!

Danke für die Antworten, eine Frage folgen: sagen, wenn ich es tue: unsigned short i = 65535, j = 65535; cout << sizeof(i + j) << endl; Das Ergebnis ist 4. Warum es ‚int‘ gefördert wurde?

+0

ein Int ist kein größerer Typ als ein Bool – aaronman

+1

Gewährleistet der Compiler immer, dass der temporäre Wert in einen größeren Typ konvertiert wird, wenn er überläuft? Nein, es konvertiert niemals einen Wert in einen größeren Typ, bis eine Umwandlung angefordert wird. – Tushar

+3

@Aaronman: In den meisten Implementierungen ist 'sizeof (bool)

Antwort

16

Es ist nicht der Überlauf, der die Umwandlung verursacht, es ist die Tatsache, dass Sie überhaupt arithmetisch gearbeitet haben. In C++ (und C, woher das Verhalten stammt) durchlaufen die Operanden der arithmetischen Grundoperatoren für integrierte Typen eine Reihe von klar definierten Aktionen, bevor die Berechnung durchgeführt wird. Die einfachste dieser Regeln (etwas vereinfacht) besteht darin, dass jeder Typ kleiner als int zu int heraufgestuft wird.

Ihre Nachfolgefrage hat die gleiche Antwort - Ihr short ist kleiner als ein int, so dass es zu einem int befördert wird, bevor die Addition stattfindet.

This StackOverflow question hat mehrere Antworten, die die Werbeaktionen detaillierter beschreiben.

+0

Bool ist nicht immer Größe 1 – aaronman

+1

Ich habe nicht gesagt, dass es war, habe ich? Ich denke, ich könnte meine Antwort mit "Wenn es eine Konvertierung gibt" voranstellen. –

+0

Schön! Vielen Dank. – JASON

1

Zuerst teilt sizeof Ihnen nicht mit, dass das Ergebnis in einen int Wert konvertiert wird. Es ist erlaubt, und in der Tat nicht ungewöhnlich, dass bool die gleiche Größe wie int hat.

aber Sie werden in der Tat ein int hier, aber das ist in keinem Zusammenhang mit den Werten (in der Tat kann der Typ nicht die Werte auf die Werte, weil in der Regel abhängig sind, nicht erst zur Laufzeit bekannt sein, während der Typ bei der Kompilierung festgelegt werden müssen,).

Was passiert, ist, dass vor der Zugabe, die bool Werte int befördert zu werden, weil bool als Integer-Typ definiert ist, und Integer-Typen kleiner als intalle erhalten zu int gefördert. Sie fügen dann drei Werte int hinzu (eine Operation, die nicht überläuft, egal welche bool Werte Sie verwenden, da INT_MAX garantiert größer als 3 ist).

+0

Ja, wenn Sie Armbanduhren und die gazillion anderen eingebetteten 8-Bit-Mikrocontroller zählen. Ich rechne mit allen modernen Compilern und Plattformen, die ich gesehen habe, ist ein einzelnes Byte. Ein Bool kann also nur auf 8-Bit-Plattformen die Größe eines int haben. – dtech

+0

Selbst auf einem 8-Bit-Mikro muss "int" mindestens 16 Bit sein. Ich nehme an, selbst dort sind sie nicht gleich groß. –

+0

@ ddriver: Der Punkt ist nicht, dass "int" könnte 8 Bit (es kann nicht sein), aber das 'bool' kann größer als ein Byte sein. Und das ist nicht nur ein theoretisches Problem: http://stackoverflow.com/a/6935286/1032073 – celtschk