2014-03-24 11 views
17

Ich habe heute irgendwie mit dem Schreiben von Code angefangen. Nehmen wir als Beispiel:Gibt es einen Unterschied zwischen Besetzung und starker Typzuweisung?

long valueCast = (long)(10 + intVariable); 
long valueTyped = 10L + intVariable; 

Gibt es einen Unterschied zwischen diesen beiden oder sind sie genau das gleiche kompiliert? Gibt es eine Konvention für eine über die andere?

Also ich weiß, das ist keine kritische Frage (beide funktionieren). Ich bin nur sehr neugierig, was der Unterschied sein könnte!

BEARBEITEN - Modifizierte das Codebeispiel, um näher zu sein, was mein ursprüngliches Szenario tatsächlich ist. Ich wollte, dass die Frage klar ist, also habe ich die Variable durch eine Konstante ersetzt. Realisierte nicht, dass der Compiler automatisch zur Arithmetik würde (wodurch die Antworten auf diese Frage geändert werden)

+0

@ FrédéricHamidi Nein, sie sind funktionell anders, so dass sie sicherlich nicht auf die gleiche Sache kompilieren werden. Wenn die Klammern anders wären und die Besetzung vor der Hinzufügung wäre, dann könnten sie sich möglicherweise zu der gleichen Sache kompilieren. – Servy

+0

@Servy, Punkt genommen. Ich wollte gerade etwas sagen, aber der Fragesteller, der das wörtliche "2" in "intVariable" umwandelt, macht meinen Standpunkt irrelevant. –

+0

Als eine FYI für andere später. Ich habe zuerst versucht, [die Typdokumentation für lange] zu referenzieren (http://msdn.microsoft.com/en-us/library/ctetwysk.aspx). Es hat meine Frage nicht gelöst, aber es könnte später jemand anderem helfen. –

Antwort

39

Ja, es gibt einen großen Unterschied zwischen diesen beiden. Nicht für diese bestimmten Werte, aber der exakt gleiche Ausdruck mit unterschiedlichen Werten zeigt den Unterschied.

In der ersten Version wird die Addition in 32-Bit-Arithmetik durchgeführt, und dann wird das Ergebnis in eine long umgewandelt.

In der zweiten Version ist der erste Operand bereits ein long, daher wird der zweite Operand auf long hochgestuft und die Addition wird dann in 64-Bit-Arithmetik durchgeführt. In diesem Fall wird der Compiler sowieso die Arithmetik selbst ausführen (und in beiden Fällen zu der gleichen Schlussfolgerung kommen), aber es ist wichtig, den Unterschied zwischen dem Ergebnis einer Operation und dem Konvertieren einer der beiden zu verstehen die Operanden eines Vorgangs.

Als Beispiel:

unchecked 
{ 
    long valueCast = (long)(2000000000 + 2000000000); 
    long valueTyped = 2000000000L + 2000000000; 
    Console.WriteLine(valueCast); 
    Console.WriteLine(valueTyped); 
} 

Ergebnis:

-294967296 
4000000000 

Beachten Sie, dass dies in einem explizit ungeprüften Kontext getan werden muss, da sonst die erste Zugabe nicht einmal kompilieren würde - Sie erhalten einen Fehler von "CS0220: Der Vorgang überläuft zur Kompilierzeit im aktivierten Modus".

+0

Also (lang) 10 + 2 und 10L + 2 sind Äquivalente? (Ich habe wirklich Zweifel) – Areks

+3

@Areks: Ja, * diese * sind gleichwertig ... obwohl letztere natürlich Konstanten außerhalb des 32-Bit-Bereichs ausdrücken könnten. –

+2

Danke Jon! Ich habe gesehen, wie deine Antwort von Grund auf neu erstellt und gewählt wurde. Ich habe das Gefühl, dass ich jetzt ohne Reue sterben kann! – Areks

7

Nun, das ist ein Compiler-Fehler: „Der Betrieb bei der Kompilierung überläuft im aufgegebenen Modus“

long valueCast = (long)(2147483647 + 2); 

Während das funktioniert gut:

long valueTyped = (2147483647L + 2); 

Als Jon Skeet sagt, der Unterschied ist, ob man die Summe zu long, bevor Sie oder danach konvertieren.

+4

Und natürlich, Jon bearbeitet im Wesentlichen das gleiche Beispiel, wie ich meine Antwort tippe. :) –

+0

War es ein Ninja-Schnitt? –

+0

@dev_feed Nun, es ist schließlich Jon Skeet, von dem wir reden. –

2

In Ihrem Beispiel 10L + 2; ist gleich ((lang) 10) + 2;

Dies ist nicht dasselbe wie (long) (10 + 2), weil:

(long) (10 + 2) Betrieb als int (32bit) ausführt, und dann zu lang umgesetzt wird (64bit)

((lang) 10) + 2; Operation wird so lange ausgeführt (64bit), weil 10 in lange vor der eigentlichen Operation umgewandelt wird

Verwandte Themen