在VB.NET中,是否有用于执行不安全算术运算的实用方法?

3
我正在覆盖获取哈希码的过程。在某个时候,代码执行到了这个点。
Hash = 1210600964 * 31 + -837896230

会导致 OverflowException 异常。我能使用类似下面的方法吗:

Hash = addUnsafe(multiplyUnsafe(1210600964, 31), -837896230)

我是否可以在不需要将我的项目链接到另一个程序集的情况下禁用溢出检查呢? 我不想移除溢出检查。 dllimports 是可以接受的。


@sstan 不是的,这是在询问一个允许不安全算术运算的系统API。 - Joseph Nields
通过 unsafe,我理解你想让你的代码允许算术溢出而不抛出异常,是这样吗?如果是这样,那么 C# 的关键字 unchecked 就可以实现这一点,但是 VB.NET 并不具备本地支持。我提供的链接中提供了 VB.NET 克服这种限制的方法。如果我误解了你,请告诉我。 - sstan
1个回答

4

您可以使用64位数字进行计算,然后使用And截断任何多余的部分:

Option Infer On
' .....
Shared Function MultiplyWithTruncate(a As Integer, b As Integer) As Integer
    Dim x = CLng(a) * CLng(b)
    Return CInt(x And &HFFFFFFFF)
End Function

虽然您可以在一个解决方案中混合使用C#和VB.NET项目,但编写一个C#类来执行未经检查的算术运算可能是最简单的选择,即使您不喜欢添加对另一个程序集的引用。
甚至编写C#函数也是一个好主意,这样您就可以测试VB函数是否返回预期值。这就是我检查上面代码时所做的。
编辑:Joseph Nields的评论促使我测试性能,结果使用CLng而不是Convert.ToInt64和And更快。

2
可能更容易的方法是定义Const mask = &HFFFFFFFF,然后返回CInt(x And mask),它总是适合于Int32 - Joseph Nields
1
这个解决方案对我不起作用,仍然会引发OverflowException异常。&HFFFFFFFF在有符号整数中表示-1。但是使用&H7FFFFFFF(又名Integer.MaxValue)可以解决问题。 - Crusha K. Rool

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接