我真的很困惑,为什么下面的代码在VB中运行时会给我不同的结果。. NET,而不是c#。我读到两种语言之间存在一些二进制移位差异,但我无法找出我需要做什么来制作VB。. NET显示与c#相同的'pos'答案。
Imports System.Threading
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
MultiplyH({168, 238, 95, 83, 235, 11, 228, 190, 8, 58, 0, 0, 0, 0, 0, 0})
End Sub
Public Sub MultiplyH(ByVal x As Byte())
Dim pos As Integer = x(15) << 1
Dim i = 14
While i >= 0
pos = x(i) << 1
Interlocked.Decrement(i)
End While
End Sub
End Class
'pos'的前八个答案都是相同的(对于0来说是预期的),但是一旦i = 6, VB。NET显示pos = 124,而c#显示pos = 380。谁能帮助我,使pos = 380在VB。净吗?
c#代码,顺便说一下,是:int pos = x[15] << 1;
for (int i = 14; i >= 0; --i)
{
pos = x[i] << 1;
}
来自c#<<
操作符的文档:
由于移位操作符仅针对int、uint、long和ulong类型定义,因此操作的结果总是至少包含32位。如果左操作数为其他整型(sbyte、byte、short、ushort或char),则将其值转换为整型
(我强调。)
来自VB的文档。. NET<<
操作符:
结果总是与被移位表达式的数据类型相同。
在VB中得到相同的结果。. NET中,你需要使用:
pos = CInt(x(i)) << 1