Alle diese sind richtig. Hier ist, was der C ++ 03 Standard sagt (§5 / 9):
Viele binäre Operatoren, die Operanden des arithmetischen Typs oder des Aufzählungstyps erwarten, verursachen in ähnlicher Weise Konvertierungen und Ergebnistypen. Der Zweck ist, einen gemeinsamen Typ zu ergeben, der auch der Typ des Ergebnisses ist. Dieses Muster wird als übliche arithmetische Konvertierungen bezeichnet, die wie folgt definiert sind:
- Wenn einer der Operanden vom Typ
long double
ist, wird der andere inlong double
konvertiert.- Andernfalls, wenn einer der Operanden
double
ist, wird der andere indouble
konvertiert.- Andernfalls, wenn einer der Operanden
float
ist, wird der andere infloat
konvertiert.- Andernfalls müssen die Integral-Promotions (4.5) für beide Operanden durchgeführt werden.
- Wenn dann einer der Operanden
unsigned long
ist, wird der andere inunsigned long
konvertiert.- Andernfalls, wenn ein Operand ein
long int
und der andereunsigned int
ist, dann wenn einlong int
alle Werte einesunsigned int
repräsentieren kann, wirdunsigned int
in einlong int
umgewandelt; andernfalls sollten beide Operanden inunsigned long int
konvertiert werden.- Andernfalls, wenn einer der Operanden
long
ist, wird der andere inlong
konvertiert.- Andernfalls, wenn einer der Operanden
unsigned
ist, wird der andere inunsigned
konvertiert.[ Hinweis: Andernfalls ist der einzige verbleibende Fall, dass beide Operanden
sindint
]
operator/
für grundlegende Datentypen (genau wie die meisten, wenn nicht alle, Operatoren für Basistypen) gibt den stärksten Typ seiner beiden Operanden zurück.
Die Antwort auf all Ihre Fragen ist also ja.
Im Allgemeinen sind Gleitkommatypen stärker als ganzzahlige und unsignierte sind stärker als signiert ...
Definieren von & gt; Als "stärker als" können wir das sagen:
langes Doppel & gt; Doppel & gt; float & gt; unsigned long & gt; lang & gt; unsigniertes int & gt; int & gt; unsigned kurz & gt; kurz & gt; unsigniertes Char & gt; Zeichen
Sie haben in allen Fällen Recht. Die Regeln für Vorgänge mit mindestens einem Gleitkommatyp lauten wie folgt: Wenn einer der beiden Typen long double
ist, lautet das Ergebnis long double
; Wenn einer der beiden Typen double
ist, lautet das Ergebnis double
, andernfalls hat das Ergebnis den Typ float
.
Arithmetische Operationen zwischen zwei int
s ergeben ein int
Ergebnis.
Die Regeln zwischen anderen Typen sind etwas komplexer und können implementierungsabhängig sein; Bei fast allen Operationen bedeuten Integer-Promotions, dass die Operanden auf mindestens int
size-Typen hochgestuft werden, die mindestens ein int
size-Ergebnis ergeben.
Das Ergebnis wird getippt (wenn eine Regel existiert) für die Zuweisung. Wenn Sie int x = dY + iZ;
haben Dann führt die Aktion dazu, dass das Additionsergebnis doppelt ist, aber es wird in ein int konvertiert, wenn es x zugeordnet ist. Google "variable Förderung in C ++" für weitere Details.
Grob gesagt werden in C ++ in jedem Szenario beide Operanden vor der Ausführung der Operation in den "größten" Typ der beiden Operandentypen konvertiert. Siehe MSDN Standard Arithmetic Conversions .
Tags und Links c++