Frage

Ich versuche, einen großen Int64 mit knabbern Informationen in Bytes gespeichert zu konstruieren.

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

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

Update:. Der Fehler tritt auch bei der Verwendung von (Int64) (0x0d << 28)

War es hilfreich?

Lösung

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. Gießen nach der Multiplikation wird dir nicht gut in diesem Fall.

nicht getestet, aber dieser Code sollte funktionieren:

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

Andere Tipps

Integer haben den Typ Int32 (auch wenn in hex). Verwenden Sie die "L" Suffix sie sehnen (Int64) zu machen.

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

Die erste Blick würde ich vermuten, dass es die Multiplikation mit einem Int32 tut, und überfüllt. Sie müssen die einzelnen Operanden zu Int64 werfen dann diejenigen multiplizieren. Gerade jetzt sind Sie nur Gießen das Ergebnis aus.

Das heißt, ich weiß nicht, warum es nur Problem mit, dass eine Zeile und nicht die ersten mit der größeren Zahl finden würde.

ND

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