3

方程很简单,int = int * int / int; 但是,整数的乘法可能会变得太大,我试图Int64在执行之前将所有内容都转换为 s,然后将结果转换回整数。因此我有:

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

它抱怨所有三个 Int64 演员表。

注意:目标是 x86,因为我使用的是 32 位库。 机器本身是 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 次转换完成后输出为 Int64。最终的 int 转换将对最终计算的值起作用,并且它显式转换为 int,因为 Int64 不能直接转换为 int(防止溢出)。没有中间值溢出。

于 2012-12-25T05:31:40.097 回答
3

第一次演员表产生一个 Int64。Int64 * int 是 Int64。除以 int 就是 Int64。

于 2012-12-25T05:00:41.153 回答
0

铸造其中之一就足够了

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 回答