1

バイト単位で保存されたニブル情報を使用して、大きな Int64 を構築しようとしました。

次のコード行は期待どおりに機能します。

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

次の行でコンパイル エラー CS0220 "チェック モードでのコンパイル時に操作がオーバーフローします" が発生し、他の行では発生しないのはなぜですか?

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

結果は次のようになります。

FFFFFFFFD0000000

それ以外の:

0000D0000000

誰でもこれを説明できますか?シフト演算子で変換しますが、なぜこのアプローチがうまくいかないのか、まだ興味があります!

更新: (Int64)(0x0d << 28) を使用した場合にもエラーが発生します。

4

3 に答える 3

2

定数値を特に long (Int64s) または場合によっては ulongs (UInt64s) としてマークする必要があります。そうしないと、デフォルトでそれらは int (つまり Int32s) としてインタープリターになり、明らかにオーバーフローが発生します。この場合、乗算操作の後にキャストしても何の役にも立ちません。

テストしていませんが、このコードは機能するはずです:

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x1000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x100000L);
于 2009-04-03T09:53:23.690 に答える
1

整数リテラルの型は Int32 です (16 進数であっても)。long 型 (Int64) にするには、「L」サフィックスを使用します。

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
于 2009-04-03T09:53:48.947 に答える
-1

一見すると、Int32 で乗算を行ってオーバーフローしていると思います。個々のオペランドを Int64 にキャストしてから乗算する必要があります。現在、結果をキャストしているだけです。

そうは言っても、なぜその1行だけに問題があり、より大きな数の最初の行には問題がないのかわかりません。

ND

于 2009-04-03T09:52:27.750 に答える