C ++ - Art der Teilung?

8

Ich möchte sicherstellen, dass ich den Rückgabetyp der C ++ - Division verstehe,

%Vor%

Bitte korrigieren Sie mich, wenn ich falsch liege.

Danke

    
q0987 25.04.2011, 16:37
quelle

6 Antworten

9

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 in long double konvertiert.
  •   
  • Andernfalls, wenn einer der Operanden double ist, wird der andere in double konvertiert.
  •   
  • Andernfalls, wenn einer der Operanden float ist, wird der andere in float 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 in unsigned long konvertiert.
  •   
  • Andernfalls, wenn ein Operand ein long int und der andere unsigned int ist, dann wenn ein long int alle Werte eines unsigned int repräsentieren kann, wird unsigned int in ein long int umgewandelt; andernfalls sollten beide Operanden in unsigned long int konvertiert werden.
  •   
  • Andernfalls, wenn einer der Operanden long ist, wird der andere in long konvertiert.
  •   
  • Andernfalls, wenn einer der Operanden unsigned ist, wird der andere in unsigned konvertiert.
  •   

[ Hinweis: Andernfalls ist der einzige verbleibende Fall, dass beide Operanden int ]

sind
    
ildjarn 25.04.2011, 16:42
quelle
4

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

    
peoro 25.04.2011 16:41
quelle
1

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.

    
Charles Bailey 25.04.2011 16:40
quelle
1

Betrachtet nur drei Typen ( float , double und int ):

  • Wenn einer der Operanden double ist, lautet das Ergebnis double .
  • Ansonsten, wenn einer der Operanden float ist, dann wird das Ergebnis float .
  • sein
  • Andernfalls wird das Ergebnis int .
  • sein
Nawaz 25.04.2011 16:40
quelle
0

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.

    
Jess 25.04.2011 16:41
quelle
0

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 .

    
Eric Mickelsen 25.04.2011 16:42
quelle

Tags und Links