質問

私はバイトに保存されているニブルの情報と大きな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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top