在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」。
你應該使用'Asc'而不是'AscW'。請參閱http://msdn.microsoft。com/en-us/library/zew1e4wc(v = vs.80).aspx – 2012-04-20 08:04:35
@SaniHuttunen Asc也給出相同的錯誤。 – Ali 2012-04-20 08:06:11
要刪除錯誤,您需要在「高級編譯器選項」對話框中禁用整數溢出檢查。 – 2012-04-20 08:13:53