C#错误中的乘法

时间:2015-01-12 12:14:05

标签: c# type-conversion multiplication

当乘以一组int并将结果转换为long时,我得到一个不同的答案,而不是当我乘以一组双精度并将结果转换为long时。例如:

int a = 5;
int b = 5;
int c = 7;
int d = 6;
int ee = 6;
int f = 8;
int g = 9;
int h = 6;
int i = 6;
int j = 4;
int k = 8;
int l = 9;
int m = 5;
long x = a * b * c * d * ee * f * g * h * i * j * k * l * m;

double aa = 5;
double ab = 5;
double ac = 7;
double ad = 6;
double aee = 6;
double af = 8;
double ag = 9;
double ah = 6;
double ai = 6;
double aj = 4;
double ak = 8;
double al = 9;
double am = 5;
long y = (long)(aa * ab * ac * ad * aee * af * ag * ah * ai * aj * ak * al * am);

谁能告诉我为什么会这样?谢谢

3 个答案:

答案 0 :(得分:13)

你有一个整数溢出,因为只要你将int乘以int,你就会Int32: 到目前为止,这被解释为 a * b * c * d * ee * f * g * h * i * j * k * l * m

Int64

并且仅转换为longlong)。要更正实现,请声明 所有变量最初都是 long a = 5; long b = 5; // actually, not necessary, since a * b will be long, but safer long c = 7; ... long m = 5; long x = a * b * c * d * ee * f * g * h * i * j * k * l * m; ,例如

{{1}}

答案 1 :(得分:5)

这可能是因为乘法的结果太大而无法在Int32中保留 - 但它可以保持在一个双倍。

更具体地看一下十六进制中的x和y:

  

x = 0x000000007994b000
  y = 0x000000057994b000

Int32只能保存较低的8个十六进制值。这就是为什么x是错误的数字。最低的8个十六进制值是正确的,但顶部被切断。

答案 2 :(得分:2)

我给它一个简短的搜索,甚至在脚本上运行一些测试,我发现了以下结果, 以脚本格式我将其测试为,

<script>
        var a = 5;
        var b = 5;
        var c = 7;
        var d = 6;
        var ee = 6;
        var f = 8;
        var g = 9;
        var h = 6;
        var i = 6;
        var j = 4;
        var k = 8;
        var l = 9;
        var m = 5;
        var x = a * b * c * d * ee * f * g * h * i * j * k * l * m;
        var y = eval(a * b * c * d * ee * f * g * h * i * j * k * l * m);
        document.writeln("RESULT X : " + x);
        document.write("<br>");
        document.writeln("RESULT Y : " + y);
    </script>

并且23514624000x的结果都为y,但在c#中,当您尝试将所有整数相乘时,结果会形成一个整数,但我们也知道{{ 1}}这比执行结果少,所以在分配给int.MAX = 2147483647的结果中它会截断原始值,而在其他结果中它不是,如果你想要两个相同的结果,你可以使用以下代码,< / p>

long x=  a * b * c * d * ee * f * g * h * i * j * k * l * m;

现在您将获得相同的结果,即 23514624000