2009-04-03 3 views
1

バイトで格納されたニブル情報を持つ大きなInt64を構築しようとしています。期待通りのコードの作業のC#でこの特定の操作がオーバーフローする(CS0220参照)のはなぜですか?

次の行:

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)を使用している場合にも発生します。

答えて

2

あなたはそれ以外の場合は、デフォルトでは、彼らは明らかにオーバーフローを引き起こし、int型(すなわちInt32s)などの通訳になり、特にlong型(Int64s)または可能性ulongs(UINT64sで)として一定の値をマークする必要があります。乗算操作後のキャスティングは、この場合、あなたには何の役にも立たないでしょう。

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

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

あなたはより速かった!回答が出たときに同じ答えを終えていた。 +1。完全にあなたの答えに同意します:) –

+0

Heh。それは私にとってもいつも起こります。 :) とりあえずありがとう。 – Noldorin

-1

一見私はInt32で乗算を行っていると思います。個々のオペランドをInt64にキャストし、それらを乗算する必要があります。今すぐあなたは結果をキャストしているだけです。

しかし、私はそれがなぜその1行で問題を見つけるのか分かりませんし、より大きい数を持つ最初の問題ではないと思います。

ND

+0

-1:キャストは、実行時変換を最適化するためにコンパイラ/ JITを必要とします。長いリテラルを使い始める方が良いです。 – Richard

1

整数リテラルはInt32型(でも進であれば)を持っています。 "L"接尾辞を使用して長さを長くします(Int64)。

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