2009-04-03 5 views
1

Ich versuche, eine große Int64 mit Nibble-Informationen in Bytes zu konstruieren.Warum diese bestimmte Operation in C# überläuft (cf. CS0220)?

Die folgenden Codezeilen wie erwartet:

Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x100000000)); 
Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x1000000)); 
Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x100000)); 

Warum wird die folgende Zeile führen zu einem Compiler-Fehler CS0220 „Der Betrieb bei der Kompilierung überläuft im aufgegebenen Modus“ und die andere nicht?

Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x10000000)); 

Das Ergebnis wäre:

FFFFFFFFD0000000 

statt:

0000D0000000 

das jemand erklären kann? Ich werde jetzt mit Shift-Operatoren konvertieren, aber immer noch neugierig, warum dieser Ansatz nicht funktioniert!

Update: Der Fehler tritt auch auf, wenn (Int64) (0x0d < < 28) verwendet wird.

Antwort

2

Sie müssen die konstanten Werte speziell als Long-Positionen (Int64s) oder möglicherweise ulongs (UInt64s), ansonsten standardmäßig markieren sie Interpreter als Ints (d int32s), deutlich überläuft verursacht. Casting nach der Multiplikation funktioniert in diesem Fall nicht gut.

nicht getestet, aber dieser Code funktionieren sollte:

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L); 
Console.WriteLine("{0:X12}", 0x0dL * 0x1000000L); 
Console.WriteLine("{0:X12}", 0x0dL * 0x100000L); 
+0

Sie waren schneller! Beendete die gleiche Antwort, als die Antwort erschien. +1. Stimme voll und ganz zu Ihrer Antwort :) –

+0

Heh. es passiert die ganze Zeit, auch für mich. :) Trotzdem danke. – Noldorin

-1

Der erste Blick würde ich vermuten, dass es die Multiplikation mit einem Int32 macht und überläuft. Sie müssen die einzelnen Operanden in Int64 umwandeln und diese dann multiplizieren. Momentan wergst du nur das Ergebnis.

Das sagte, ich weiß nicht, warum es nur Problem mit dieser einen Linie und nicht die erste mit der größeren Nummer finden würde.

ND

+0

-1: Cast erfordert den Compiler/JIT, um die Laufzeitkonvertierung zu optimieren. Lieber ein langes Literal verwenden. – Richard

1

Integer-Literale Typ Int32 haben (auch wenn in hex). Verwenden Sie das Suffix "L", um sie zu longs zu machen (Int64).

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L); 
Verwandte Themen