2012-04-20 184 views
3

在C#以下代碼返回不同的結果給出結果 「228452386」VB.NET代碼比C#代碼

UInt32 a; 

int k = 0; 

a = 0x9E3779B9; 

a += (UInt32)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24)); 

後上面的代碼是RAN, 「一」 含 「228452386」。

VB.NET中的以下相同代碼導致「算術運算導致溢出」。基本上最後一條語句是返回值「1868983913」,所以會產生運行時錯誤。

Dim a As UInt32 

Dim k As Integer = 0 

a = &H9E3779B9UI 

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

請注意上面的代碼中的變量「url」可以是任何字符串,並且兩個代碼都是相同的。

當我運行在C#和VB.NET下面的語句比他們都返回相同的值

C#

(UInt32)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24)) 

VB.NET

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

兩個語句返回值「url」「info:microsoft.com」的「1868983913」。但是,當我運行完整的語句a + = .........然後VB.NET給出錯誤,而C#返回值「228452386」。

+0

你應該使用'Asc'而不是'AscW'。請參閱http://msdn.microsoft。com/en-us/library/zew1e4wc(v = vs.80).aspx – 2012-04-20 08:04:35

+0

@SaniHuttunen Asc也給出相同的錯誤。 – Ali 2012-04-20 08:06:11

+0

要刪除錯誤,您需要在「高級編譯器選項」對話框中禁用整數溢出檢查。 – 2012-04-20 08:13:53

回答

2

你有一個溢出,因爲添加您要添加​​的兩個數字的結果比在UINT什麼適合大。

生成的數字是一個33位的數字,UInts只適合32位。

  • 在C#中,最重要的位被截斷,保持適合UInt的32位。 (這個新值不是實際添加數字的結果。)
  • 在VB.NET中,您會看到一個異常,指出該數字不適合。

VB.NET編譯器(或VS)允許您關閉此溢出檢查,以便VB.NET在此情況下的行爲與C#相同。

1

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)); 
} 

EDIT:改變代碼示例遵守編輯問題。

+0

基本上我想要基於C#代碼的VB.Net的等效代碼。 – Ali 2012-04-20 08:05:24

+0

我沒有找到VB的等效「未檢查」關鍵字。 (不知道它是否有。)但你可以打開你的VB.NET應用程序的溢出檢查,如下所述:http://stackoverflow.com/a/4515123/19594 – 2012-04-20 09:36:52

+0

請檢查我的編輯上面,因爲我有添加更多信息。 – Ali 2012-04-20 09:58:03

0

使用下面的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)) 

AscW返回一個整數(簽字),你需要的是無符號。

編輯

這工作:

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) 
+0

當我使用上述語句時,我得到了同樣的錯誤,因爲它也給我上面原始問題中所述的值「1868983913」。 – Ali 2012-04-20 09:02:41

+0

它在我的電腦上返回了相同的值,該字符串是否用於URL? – 2012-04-20 09:15:39

+0

info:microsoft.com – Ali 2012-04-20 09:52:08