gpt4 book ai didi

c# - 添加两个 long 时试图防止溢出

转载 作者:太空狗 更新时间:2023-10-30 00:49:02 26 4
gpt4 key购买 nike

我试图在两种情况下防止溢出,一种是将一个长整型与一个 float 相乘,另一种是将两个长整型相加。

喜欢:

public static long multiplyLong(long value, float multiplier)
{
if (value * multiplier > long.MaxValue)
{
Debug.Log("greater then max value");
return value = long.MaxValue;
}
else
{
Debug.Log("not greater then max value");
return (long) (value * multiplier);
}
}

public static long addLong(long value, long adder)
{
if(value + adder > long.MaxValue)
{
Debug.Log("greater then max value");
return value = long.MaxValue;
}
else
{
Debug.Log("not greater then max value");
return value + adder;
}
}

“multiplyLong”完美运行,而“addLong”运行不正常。使用 addLong 时,会发生溢出,但不会检测到溢出。我认为这很奇怪,因为代码看起来还不错。

有人可以帮助我吗?

顺便说一句,“checked”不是一个选项。

最佳答案

就像@Bradley 所说的那样,您在检查溢出时遇到了溢出。但问题远不止于此。

我们先来看这一行

if(value + adder > long.MaxValue)

这里,valueadder都是long,将它们相加就是long。但问题是 long 会自动滚动而不是抛出异常,所以如果你的值大于 long 的最大值,你只会随机得到一些其他 long 值。

现在应该清楚为什么您不想这样做,但在我们讨论正确的解决方案之前,让我们看看您的 multiplyLong 方法。具体来说,如下一行

if (value * multiplier > long.MaxValue)

在此 value 中是一个 long,multiplier 是一个 float ,将它们相乘得到一个 float ,可以很容易地根据 long 进行检查,因此您的检查似乎会起作用。

但是,如果 value * multiplier 的值大于 long.MaxValue 并将其转换为 long 怎么办?

答案是得到long.MinValue,肯定小于long.MaxValue

关于这个话题还有很多可以说的,但这应该足以让您相信您所做的并不好。

现在,你应该做什么?我建议使用 decimal 类型有两个原因。第一,它的范围比long大得多(decimal可以达到79228162514264337593543950335,其中long只能上升到 9223372036854775807),另一个原因是它在发生溢出时抛出显式异常。

例如,这是我重写的你的代码版本

public static long multiplyLong(decimal value, decimal multiplier)
{
try
{
return value*multiplier;
}
catch (OverflowException e)
{
Debug.Log("greater then max value");
return decimal.MaxValue;
}

}

public static long addLong(decimal value, decimal adder)
{
try
{
return value+adder;
}
catch (OverflowException e)
{
Debug.Log("greater then max value");
return decimal.MaxValue;
}
}

关于c# - 添加两个 long 时试图防止溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41228754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com