我试图在我的应用程序中将两个数字相乘,但在某些情况下会导致错误的值
var result = 0;
var firstNumber = 654165;
var secondNumber = 6541;
result = firstNumber * secondNumber;
结果-16074031
是错误的
你能帮我找出错误在哪里吗?
我试图在我的应用程序中将两个数字相乘,但在某些情况下会导致错误的值
var result = 0;
var firstNumber = 654165;
var secondNumber = 6541;
result = firstNumber * secondNumber;
结果-16074031
是错误的
你能帮我找出错误在哪里吗?
尝试这个:
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;
}
您的隐式类型变量都被创建为int
,但您的计算结果只适合 a long
,因此您会看到溢出错误。
如果你只是简单地声明result
为 a long
,你仍然会看到错误的结果,因为操作是在两个int
s 上执行的,直到赋值时才转换为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;
你正在溢出。
使用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
)
你有一个溢出。您应该使用大于 32 位的类型。(例如 long 表示小数)
尽管对所有声明都使用了 var ,但使用 long ,那么您将获得正确的输出
结果应该是类型long
您可以通过更改为来做到这一点。
var result = 0L;
var firstNumber = 654165L;
var secondNumber = 6541L;
result = firstNumber * secondNumber;
乘法正在创建一个大于 int 的数字并且正在溢出。