簡體   English   中英

按位移位操作在VB.NET中提供的是32位結果而不是64位結果

[英]Bitwise shifting operation gives a 32-bit result instead of a 64-bit result in VB.NET

當我將兩個32位整數組合在一起時,它應該形成一個64位長整數,但仍為32位負值。 怎么了?

僅此行應生成大於32位的數字: (readDword() And &HFFFFFFFF) << 32)

VB.NET代碼進行測試

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim u As Long = ((readDword() And &HFFFFFFFF) << 32) Or _
        (readDword2() And &HFFFFFFFF)
End Sub

Function readDword() As Integer
    Dim i As Integer = (((0 And &HFF) << 24) Or _
((0 And &HFF) << 16) Or _
((11 And &HFF) << 8) Or _
(58 And &HFF))
    Return i
End Function

Function readDword2() As Integer
    Dim i As Integer = (((241 And &HFF) << 24) Or _
((145 And &HFF) << 16) Or _
((136 And &HFF) << 8) Or _
(247 And &HFF))
    Return i
End Function



預期成績
-----------------------------
輸入字節= 0,0,11,58,241,145,136,247
結果我得到= -242119681
預期結果= 12347788855543
------------------------------


這可以正常工作,但它倒退了,所以我嘗試自己按位進行操作

    Dim bytesz() As Byte = New Byte() {247, 136, 145, 241, 58, 11, 0, 0}
    Dim a As Int64 = BitConverter.ToInt64(bytesz, 0)

如何用Java編寫字節

  public void writeQWord(long l) throws IOException {
    write((int) (l >> 56)); //0
    write((int) (l >> 48)); //0
    write((int) (l >> 40)); //11
    write((int) (l >> 32)); //58
    write((int) (l >> 24)); //241
    write((int) (l >> 16)); //145
    write((int) (l >> 8));  //136
    write((int) (l));   }   //247

固定

正確的代碼是:

Public Function ReadQWord() As Long
    Return (CLng(ReadDWord() And &HFFFFFFFFL) << 32) Or CLng(ReadDWord() And &HFFFFFFFFL)
End Function

使用按位運算符和常量時,請確保常量類型可以反映您的用法。

這個

    Dim u As Long = 1 << 32

和這個

    Dim u As Long = 1L << 32

產生不同的結果。 我還注意到,您的函數readDword僅在返回和內部產生一個整數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM