【发布时间】:2012-04-20 07:57:29
【问题描述】:
以下 C# 代码给出结果“228452386”
UInt32 a;
int k = 0;
a = 0x9E3779B9;
a += (UInt32)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));
上述代码运行后,“a”包含“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。见msdn.microsoft.com/en-us/library/zew1e4wc(v=vs.80).aspx -
@SaniHuttunen Asc 也给出了同样的错误。
-
要消除错误,您需要在“高级编译器选项”对话框中禁用整数溢出检查。
-
@DejanJanjušević 他们都与不同的问题有关。
标签: c# vb.net bit-manipulation runtime-error