2016-03-24 22 views
5

Zgodnie z MSDN Short typ danych składa się z dwóch bajtów: https://msdn.microsoft.com/en-us/library/47zceaw7.aspxDlaczego mój krótki zawierający 4 bajty w VB.NET

Ale jeśli zdefiniować zmienną Short, zawartość jest zawsze 4 bajty: & HFFFFFFFF

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

I to stwierdzenie nawet daje mi błąd:

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

co chodzi z tym? Dlaczego mój Short nie zajmuje dwóch bajtów?

MWE dodania:

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

Twój komunikat o błędzie nie zaskakuje mnie widząc, że * podpis * Short może pomieścić tylko 32 767, więc '& HFFFF' jest za duży. Czy możesz pokazać fragment kodu wykonywalnego, który pokazuje twój problem? Skąd wiadomo, że zawartość w tym miejscu to 4 bajty? –

+0

@Farhan Dzięki, to był mój błąd w rozumowaniu, moim zamiarem jest ustawienie wszystkich bitów na 1 i nie przekazanie wartości & HFFFF, jak mogę to zrobić? – bitlischieber

+0

@Macro Funkcja "Przesunięcie myszy" i okno obserwacyjne w VS pokazały mi wartość. – bitlischieber

Odpowiedz

5

Jest ponieważ Short jest podpisał, więc najbardziej znaczący bit jest zarezerwowany dla znaku. Dlatego najwyższa wartość można przechowywać w podpisał krótkie jest &H7FFF lub Int16.MaxValue

Jeśli chcesz wykorzystać wszystkie 16 bitów to trzeba użyć Unsigned krótki (UInt16)

Więc to się nie powiedzie:

Dim crc As Short = CShort(&HFFFF) 

Ale to działa:

Dim crc As UShort = CUShort(&HFFFF)