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

标签 c# vb.net bit-manipulation runtime-error

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”。

最佳答案

你有一个溢出,因为将你添加的两个数字相加的结果大于 UInt 中的内容。

生成的数字是一个 33 位数字,UInt 只适合 32 位。

  • 在 C# 中,最重要的位被切掉,保留适合 UInt 的 32 位。 (这个新值不是您的数字相加的实际结果。)
  • 在 VB.NET 中,您会收到一个异常,指出数字不合适。

VB.NET 编译器(或 VS)允许您关闭此溢出检查,以便 VB.NET 在这种情况下表现得像 C#。

关于c# - VB.NET 代码返回与 C# 代码不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10242355/

相关文章:

c# - 计算多个日期/时间范围之间的交叉点的位置和数量?

c - 从/proc/pid/stat中的tty_nr属性获取次设备号

c++ - 在没有条件的情况下将一个 unsigned char 的一位设置为另一个 unsigned char 的另一位

C# : Interface without Namespace

c# - 使用 Thread.Sleep 等待的替代方法

c# - Linq 选择某些属性到另一个对象?

vb.net - 如何在 vb.net 中裁剪图像?

c# - 将 FileContentResult 与未经授权的结果一起使用

c# - ASP.NET MVC网站从磁盘读取文件问题

javascript - Chip8 仿真器上的碰撞检测