2016-03-24 17 views
5

Secondo MSDN un tipo di dati Short è costituito da due byte: https://msdn.microsoft.com/en-us/library/47zceaw7.aspxPerché il mio corto contenente 4 byte in VB.net

Ma se io definisco una variabile Short, il contenuto è sempre 4 byte: & HFFFFFFFF

Dim crc As Short = CShort(&HFFFFS) ' crc = &HFFFFFFFF 
Dim crc As Short = &HFFFFS   ' crc = &HFFFFFFFF 

E questa affermazione anche mi dà un errore:

Dim crc As Short = CShort(&HFFFF) ' Error: Constant expression not representable in type 'Short' 

Qual è il problema con questo? Perché il mio Short non richiede due byte?

MWE aggiunto:

Public Function CRC16(ByVal dataFrame As Byte(), ByVal dataLength As Int16) As Int16 

    Dim index As Int16 
    Dim crc As Short = &HFFFFS 

    For iCount As Int16 = 0 To CShort(dataLength - 1) 
     index = (crc >> 8) Xor dataFrame(iCount) 
     crc = CShort(&HFFFF And ((crc << 8) Xor CRC_Table(index))) 
    Next 

    Return crc 

End Function 
+1

La tua dichiarazione di errore non mi sorprende visto che un * firmato * 'Short' può contenere solo fino a 32.767 - quindi' & HFFFF' è troppo grande. Puoi mostrare un codice eseguibile che mostra il tuo problema? Come sai che il contenuto a questo punto è di 4 byte? –

+0

@Farhan Grazie, questo è stato il mio errore nel ragionamento, la mia intenzione è quella di impostare tutti i bit su 1 e non passare il valore di & HFFFF come posso fare questo? – bitlischieber

+0

@Macro La funzione "Mouse over variable" e la finestra Watch in VS mi hanno mostrato il valore. – bitlischieber

risposta

5

E 'a causa di un Short è firmato, quindi il bit più significativa è riservata per il segno. Pertanto, il valore più alto è possibile memorizzare in un firmato breve è &H7FFF o Int16.MaxValue

Se si desidera utilizzare tutti i 16 bit, allora avete bisogno di utilizzare un Unsigned Corto (UInt16)

Quindi questo non riesce:

Dim crc As Short = CShort(&HFFFF) 

Ma questo funziona:

Dim crc As UShort = CUShort(&HFFFF)