C# OverflowException仅在VB.net中,不在C中#

C# OverflowException仅在VB.net中,不在C中#,c#,vb.net,C#,Vb.net,出于自我教育的目的,我试图找到一种自己制作高度图的方法。 我在谷歌上搜索了一下,发现了一个创建伪随机数的函数 public static float Noise(int x) { x = (x << 13) ^ x; return (1f - ((x * (x * x * 15731 + 789221) + 1376312589) & 0x7FFFFFFF) / 1073741824.0f); } 所以,我的第一个问

出于自我教育的目的,我试图找到一种自己制作高度图的方法。 我在谷歌上搜索了一下,发现了一个创建伪随机数的函数

    public static float Noise(int x)
    {
        x = (x << 13) ^ x;

        return (1f - ((x * (x * x * 15731 + 789221) + 1376312589) & 0x7FFFFFFF) / 1073741824.0f);
    }
所以,我的第一个问题是:为什么我在VB.net中得到
OverflowException
,而在C#中没有?如果临时结果对于其包含的变量来说太大,那么无论我使用什么语言,它都应该太大

我的第二个问题是:我能做些什么使它也在VB.net中工作

谢谢你的回答

为什么我在VB.net中得到OverflowException而在C#中没有

因为VB项目默认检查溢出,而C#不检查。如果您将项目设置为检查溢出,或者将代码放入
checked{}
块中,您将在C#中看到相同的异常:

public static float Noise(int x)
{
    x = (x << 13) ^ x;
    checked{
        return (1f - ((x * (x * x * 15731) + 1376312589) & 0x7FFFFFFF) / 1073741824.0f);
    }
}
您还可以打开VB项目的“删除整数溢出检查”属性,但这是项目范围内的设置。VB目前无法像C#那样关闭特定代码行的溢出检查

无论您做什么,我都会彻底测试它,因为您正在计算一个浮点值,位屏蔽它(
和&H7FFFFFFF
),然后除以另一个浮点值。混合整数和浮点数学可能非常棘手


还要注意的是,您的两个代码段并不相等。C#函数返回一个
float
,而VB返回一个
Double
。在VB中使用浮点文字,但在C#中使用整数文字。这看起来可能没有太大的区别,但它可能会意外地改变数学。

正如D Stanley指出的,VB.net中出现
OverFlowException
的原因是VB.net会自动对整数运算进行溢出检查,而C#不会

如果其他人对在VB.net中使用它感兴趣,您可以执行以下操作:

将此结构添加到项目中

<StructLayout(LayoutKind.Explicit)>
Public Structure LongToIntegerNoOverflow
    <FieldOffset(0)>
    Public LongValue As Long
    <FieldOffset(0)>
    Public IntValue As Integer
End Structure

公共结构LongToIntegerNoOverflow
公共价值
作为整数的公共IntValue
端部结构
并将噪波函数更改为

Private Function Noise(ByVal x As Integer) As Single
    Dim x1 As Long
    Dim x2 As LongToIntegerNoOverflow
    Dim x3 As LongToIntegerNoOverflow
    Dim x4 As Long

    x1 = (x << 13) Xor x

    x2.LongValue = x1 * x1 * 15731 + 789221
    x3.LongValue = x1 * x2.IntValue + 1376312589

    x4 = x3.IntValue And &H7FFFFFFF

    Return (1.0R - x4 / 1073741824.0R)
End Function
专用函数噪波(ByVal x为整数)为单个
尺寸x1与长度相同
尺寸x2为长点式溢流阀
尺寸x3为LongToIntegerNoOverflow
尺寸x4与长度相同

x1=(x我已经尝试将x强制转换为双精度甚至十进制,然后
OverflowException
在x=11时出现。我建议找到一种不需要如此大的数字的方法,或者关闭VB项目的溢出检查。
Private Function Noise(ByVal x As Integer) As Double
    x = (x << 13) Xor x

    Dim y As Double = x

    Return (1.0R - ((y * (y * y * 15731.0R) + 1376312589.0R) And &H7FFFFFFF) / 1073741824.0R)
End Function
<StructLayout(LayoutKind.Explicit)>
Public Structure LongToIntegerNoOverflow
    <FieldOffset(0)>
    Public LongValue As Long
    <FieldOffset(0)>
    Public IntValue As Integer
End Structure
Private Function Noise(ByVal x As Integer) As Single
    Dim x1 As Long
    Dim x2 As LongToIntegerNoOverflow
    Dim x3 As LongToIntegerNoOverflow
    Dim x4 As Long

    x1 = (x << 13) Xor x

    x2.LongValue = x1 * x1 * 15731 + 789221
    x3.LongValue = x1 * x2.IntValue + 1376312589

    x4 = x3.IntValue And &H7FFFFFFF

    Return (1.0R - x4 / 1073741824.0R)
End Function