3

方程式は非常に単純です、int = int * int / int; ただし、intの乗算が大きくなりすぎる可能性があるため、実行する前にすべてをInt64sまでキャストしてから、結果をintにキャストし直そうとしています。したがって、私は持っています:

int = (int)((Int64)int * (Int64)int / (Int64)int);

そしてそれはInt64キャストの3つすべてについて不平を言っています。

:32ビットのみのライブラリを使用しているため、ターゲットはx86です。 マシン自体は64ビットです。x64ターゲットで理解できました。

  • 私は何かが足りないのですか?
  • Resharperは中間値がオーバーフローする問題を理解していませんか?
4

3 に答える 3

5
Int16 a = 1000;
Int16 b = 40;

var c = a * b; // c is Int32 because compiler does not want overflow

// The cast makes a3 Int64
// No need to cast a1 because all operations involving Int64
// will be Int64 to ensure no overflows when arithmetic operations are performed
var a3 = a1 * (Int64)a2; 

同じ:

var a3 = (Int64)a1 * a2;

Resharperはご存知のように賢く、コード内の3つのキャストすべてに警告を表示します。これは、それらのいずれか1つが同じ意味を持つためです。

編集:もう1つ、右側のすべての操作が評価され、1回のキャストが完了した後に出力がInt64になります。最終的なintキャストは、最終的に計算された値で機能します。Int64はintに直接キャストできないため(オーバーフローを防ぐため)、intに明示的にキャストされます。中間値のオーバーフローはありません。

于 2012-12-25T05:31:40.097 に答える
3

最初のキャストでInt64が生成されます。Int64*intはInt64です。intで割ったのはInt64です。

于 2012-12-25T05:00:41.153 に答える
0

それらの1つをキャストするだけで十分です

int x, y, z, w;
x = y = z = int.MaxValue;

以下の動作を見て、あなたはそれをすべて理解するでしょう

textBox1.Text = ((Int64)x * y).ToString();

出力:4611686014132420609

textBox2.Text = (x * y).ToString();

出力:1

textBox3.Text = ((int)((Int64)x * (Int64)y / (Int64)z)).ToString();

出力:2147483647

于 2012-12-25T05:13:59.567 に答える