gpt4 book ai didi

c# - 确定对整数使用 Func 的检查操作是否导致上溢或下溢?

转载 作者:行者123 更新时间:2023-11-30 14:51:41 25 4
gpt4 key购买 nike

我很难确定 checked操作 int使用 Func<int, int>导致上溢或下溢。如果我不使用 Func<int, int>我找到了确定这一点的方法

int _Data = Data; // Data is some integer value
int scaleValue = int.MaxValue; // Just for completion, could be any value
try
{
checked
{
Data *= scaleValue;
}
}
catch (System.OverflowException ex)
{
// Cast the values to float so we can operate beyond the integer range
// This way we can check if we went over Max or Min Values
if ((float)_Data * (float)scaleValue > int.MaxValue)
Data = int.MaxValue;
else
Data = int.MinValue;
}

尽管如果我使用 Func<int, int>那么我就不能使用上面的技巧来确定结果了。

int _Data = Data;
Func<int, int> scaleFunction = (x) => (x * int.MaxValue);
try
{
checked
{
Data = scaleFunction(Data);
}
}
catch (System.OverflowException ex)
{
// How to tell if scaleFunction created under or over flow?
if ((float)_Data * (float)scaleValue > int.MaxValue)
Data = int.MaxValue;
else
Data = int.MinValue;
}

我看到的唯一选择是“改变”给定的 Func<int, int>致力于 float , 但如果 Func<int, int> 的结构事先不知道那么我不认为它可以改变。

谁能找到实现此目标的偷偷摸摸的方法?

这是我发现原始偷偷摸摸操作的线程:Determine if integer overflow is over or under bounds

这是我之前提出的一个相关问题,提供了更多背景信息:Determine if operation will result in overflow?

编辑: 在我使用这段代码时,我将无法控制 Func<int, int> 的方式。被 build 。因此我不能放 check表达或阻塞在里面。

我也没有意识到 check不检查在其中使用的溢出“内部函数”。如果是这样,我认为这个问题就更难了。由于无法修改 Func使用 check我们必须手工检查。

手动完成的问题是(目前对我来说)似乎不可能。使用检查原始值是否与 Func 的输出值具有相同符号的技巧可能是有意义的.问题是您无法判断 Func 是否非法将值增加到超过最大值,或者合法地将值降低到 0 以下;反之亦然。

最佳答案

In my usage of this code I will not have control over the way that the Func is created. Thus I cannot put a check expression or blocked inside of it.

那么,你输了。

checked/unchecked 是 IL 级别的任何单个算术指令的属性。它不会跨方法调用流动。这不是您可以打开或关闭的设置。它针对每条指令单独编译成 .NET 二进制文件。

任何一段代码的作者决定了checked 属性并且它不能被改变。

事实上,如果您可以进入其他人的代码并巧妙地改 rebase 本算术指令的行为,那将是危险且不可靠的。

关于c# - 确定对整数使用 Func 的检查操作是否导致上溢或下溢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33763897/

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