なぜC#で、この特定の操作のオーバーフロー(参照のCS0220)?
-
23-08-2019 - |
質問
私はバイトに保存されているニブルの情報と大きな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)を使用しているときにエラーが発生し
。解決
あなたはそれ以外の場合は、デフォルトでは、彼らは明らかにオーバーフローを引き起こし、int型(すなわちInt32s)などの通訳になり、long型(Int64s)または可能性ulongs(UINT64sで)として、具体的に一定の値をマークする必要があります。乗算演算の後にキャストすると、この場合には、あなたに何か良いを行うことはありません。
テストしていませんが、このコードは動作するはずです。
Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x1000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x100000L);
他のヒント
整数リテラルはInt32型(でも進であれば)を持っています。それらlong型(Int64型)するために "L" の接尾辞を使用します。
Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
一見、私はそれがのInt32との乗算を行うこと、そして溢れるだと思いたいです。あなたはInt64型に個々のオペランドをキャストする必要がありますし、それらを掛けます。今あなただけの結果をキャストしています。
それだけでその1つのラインではなく、より大きな番号の最初の1で問題を見つけるだろう、なぜ私にはわからない、言った。
ND
所属していません StackOverflow