Sind Operanden innerhalb eines Ausdrucks zu größeren Typen nach folgenden Regeln gefördert?

StackOverflow https://stackoverflow.com/questions/3080597

Frage

Wenn numerischer Ausdruck enthält Operanden (Konstanten und Variablen) verschiedenen numerischer Typen, sind Operanden, um größere Arten gefördert nach folgenden Regeln:

  1. , wenn die Operanden der Typen byte, sbyte, char, short, ushort, sie zu int Typ konvertiert werden
  2. Wenn einer der Operanden ist int, dann werden alle Operanden zu int umgewandelt werden
  3. , wenn Ausdruck auch Operanden der Typen uint und int enthält, dann werden alle Operanden umgewandelt long
  4. Wenn einer der Operanden ist long, dann werden alle Operanden zu long umgewandelt werden
  5. wenn Ausdruck Operanden vom Typ ulong und long enthält, dann Operanden werden zu float umgewandelt
  6. Wenn einer der Operanden ist float, dann werden alle Operanden zu float umgewandelt werden
  7. , wenn einer der Operanden ist double, dann werden alle Operanden zu double umgewandelt werden

Unter der Annahme, numerischen Ausdrücke enthält Operanden verschiedenen Typen, werden alle Operanden zunächst auf einen einzigen numerischen Typen konvertiert werden, und erst dann wird die Laufzeit versucht das Ergebnis zu berechnen? Wenn zum Beispiel Variablen b1 und b2 von byte Typ ist, während i1 von int-Typ ist, wird b1 und b2 get umgewandelt vor der Berechnung (b1+b2) int:

int i2=(b1+b2)+i1
War es hilfreich?

Lösung

Die Klammern sind von höherer Priorität als +, so dass die Umwandlung normalerweise stattfinden würde nach b1 und b2 hinzugefügt wurden. Doch die + Betreiber hat keine Überlastung bytes, so müssen die bytes zuerst ints gefördert werden.

Lesen Sie auch:

Andere Tipps

haben Ihre Regeln einige Elemente der Wahrheiten, aber technisch ungenau.

Hier sind die relevanten Auszüge aus dem C # Language Specification

  

7.2.6.2 Binary numerische Aktionen

     

Binary numerische Förderung erfolgt für die Operanden der vordefinierten +, , *, /, %, &, |, ^, ==, !=, >, <, >= und <= Binäroperatoren. Binäre numerische Förderung konvertiert implizit beiden Operanden in einen gemeinsamen Typ, die im Fall der Nicht-relationalen Operatoren, auch den Ergebnistyp des Betriebes wird. Binäre numerische Förderung besteht aus den folgenden Regeln Anwendung, in der Reihenfolge erscheinen sie hier:

     
      
  • Wenn einer der Operanden vom Typ decimal sind, wird der andere Operand konvertiert decimal zu geben, oder ein Fehler bei der Kompilierung tritt auf, wenn der andere Operand vom Typ float oder double ist.
  •   
  • Wenn einer der beiden Operanden vom Typ double ist, wird der andere Operand konvertiert double zu geben.
  •   
  • Wenn einer der beiden Operanden vom Typ float ist, wird der andere Operand konvertiert float zu geben.
  •   
  • Wenn einer der beiden Operanden vom Typ ulong sind, wird der andere Operand konvertiert ulong zu geben, oder ein Fehler bei der Kompilierung tritt auf, wenn der andere Operand vom Typ sbyte, short, int oder long.
  •   
  • Wenn einer der beiden Operanden vom Typ long ist, wird der andere Operand konvertiert long zu geben.
  •   
  • Wenn einer der beiden Operanden vom Typ uint ist und der andere Operand vom Typ sbyte, short oder int, beide Operanden Typ long umgewandelt werden.
  •   
  • Wenn einer der beiden Operanden vom Typ uint ist, wird der andere Operand konvertiert uint zu geben.
  •   
  • Andernfalls werden beide Operanden Typ int umgewandelt.
  •   

  

int i2=(b1+b2)+i1

Gemäß der obigen Beschreibung, ja, byte b1, b2 unterliegt binäre Zahlen Förderung int für den binären Operator +.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top