VB.NET代码返回与C#代码不同的结果

VB.NET代码返回与C#代码不同的结果,c#,vb.net,bit-manipulation,runtime-error,C#,Vb.net,Bit Manipulation,Runtime Error,C#中的以下代码给出了结果“228452386” UInt32 a; int k=0; a=0x9E3779B9; VB.NET会自动插入溢出测试,而C则不会。等效的C代码是: UInt32 a; int k = 0; a = 0x9E3779B9; checked{ a += (UInt32)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24)); } U

C#中的以下代码给出了结果“228452386”

UInt32 a;
int k=0;
a=0x9E3779B9;

VB.NET会自动插入溢出测试,而C则不会。等效的C代码是:

UInt32 a;
int k = 0;
a = 0x9E3779B9;
checked{
    a += (UInt32)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));
}
UInt32 a;
int k=0;
a=0x9E3779B9;
检查{

a++=(UInt32)(url[k+0]+(url[k+1]使用以下VB.NET代码:

    a += CUInt(AscW(url(k + 0))) + CUInt((AscW(url(k + 1)) << 8)) + CUInt((AscW(url(k + 2)) << 16)) + CUInt((AscW(url(k + 3)) << 24))

您有一个溢出,因为将要添加的两个数字相加的结果大于UInt中的值

结果数字为33位数字,UINT仅适合32位

  • 在C#中,最高有效位只是被切碎,保留UInt中适合的32位。(这个新值不是数字相加的实际结果。)
  • 在VB.NET中,会出现一个异常,说明该数字不适合

VB.NET编译器(或VS)允许您打开此溢出检查,以便VB.NET在这种情况下的行为类似于C。

您可能应该使用
Asc
而不是
AscW
。请参阅@SANIHUTTUNE Asc也给出了相同的错误。要删除此错误,您需要在“高级编译器选项”对话框中禁用整数溢出检查。您已经开始了3个问题这里,@DejanJanjušević它们都与不同的问题有关。基本上,我想要基于C#code的VB.Net的等效代码。我没有找到VB的等效“unchecked”关键字(不知道是否有)但是您可以对VB.NET应用程序进行溢出检查,如下所述:请检查我上面的编辑,因为我添加了更多信息。我在使用上述语句时遇到了相同的错误,因为它也给出了值“1868983913”正如我在上面的原始问题中所述。它在我的电脑上返回了相同的值,你用哪个字符串作为url?请检查我在上面的编辑,因为我添加了更多信息。
(UInt32)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24))
CUInt(AscW(url(k + 0)) + (AscW(url(k + 1)) << 8) + (AscW(url(k + 2)) << 16) + (AscW(url(k + 3)) << 24))
UInt32 a;
int k = 0;
a = 0x9E3779B9;
checked{
    a += (UInt32)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));
}
    a += CUInt(AscW(url(k + 0))) + CUInt((AscW(url(k + 1)) << 8)) + CUInt((AscW(url(k + 2)) << 16)) + CUInt((AscW(url(k + 3)) << 24))
    Dim a As Int64
    Dim result As UInt32

    Dim k As Integer = 0

    Dim url As String = "info:microsoft.com"

    a = &H9E3779B9UI

    Dim a1 As UInt32 = 0
    Dim a2 As UInt32 = 0
    Dim a3 As UInt32 = 0
    Dim a4 As UInt32 = 0

    a1 = AscW(url(k + 0))
    a2 = AscW(url(k + 1)) << 8
    a3 = AscW(url(k + 2)) << 16
    a4 = AscW(url(k + 3)) << 24

    a = (a + a1 + a2 + a3 + a4) And &HFFFFFFF
    result = Convert.ToUInt32(a)