2

我试图在我的应用程序中将两个数字相乘,但在某些情况下会导致错误的值

var result = 0;
var firstNumber = 654165;
var secondNumber = 6541;
result = firstNumber * secondNumber;

结果-16074031是错误的

你能帮我找出错误在哪里吗?

4

6 回答 6

5

尝试这个:

checked
{
    var result = 0;
    var firstNumber = 654165;
    var secondNumber = 6541;
    result = firstNumber * secondNumber;
}

这样就可以看出问题了System.OverflowException。解决简单使用long

unchecked
{
    var result = 0L;
    var firstNumber = 654165L;
    var secondNumber = 6541L;
    result = firstNumber * secondNumber;
}

查看已选中未选中的关键字。

于 2013-09-18T10:25:45.737 回答
4

您的隐式类型变量都被创建为int,但您的计算结果只适合 a long,因此您会看到溢出错误。

如果你只是简单地声明result为 a long,你仍然会看到错误的结果,因为操作是在两个ints 上执行的,直到赋值时才转换为long,此时溢出已经发生。

因此,您需要在计算期间将一个(或两个)数字声明为long,或将一个(或两个!)转换long为 。您还可以省略0对`result的冗余分配:

int firstNumber = 654165;
int secondNumber = 6541;
long result = (long)firstNumber * secondNumber;

或者:

long firstNumber = 654165;
int secondNumber = 6541;
long result = firstNumber * secondNumber;
于 2013-09-18T10:26:12.037 回答
1

你正在溢出。

使用long而不是var三个声明,它会给你正确的结果。

long result = 0;
long firstNumber = 654165;
long secondNumber = 6541;
result = firstNumber * secondNumber;

使用var编译器将类型分配Int32给您的变量。

结果是4,278,893,265大于Int32.MaxValue(即 2,147,483,647

于 2013-09-18T10:23:54.183 回答
1

你有一个溢出。您应该使用大于 32 位的类型。(例如 long 表示小数)

于 2013-09-18T10:24:03.803 回答
0

尽管对所有声明都使用了 var ,但使用 long ,那么您将获得正确的输出

于 2013-09-18T10:25:39.653 回答
0

结果应该是类型long

您可以通过更改为来做到这一点。

var result = 0L;
var firstNumber = 654165L;
var secondNumber = 6541L;
result = firstNumber * secondNumber;

乘法正在创建一个大于 int 的数字并且正在溢出。

于 2013-09-18T10:26:38.953 回答