Literały numeryczne w języku C# to int
, a nie byte
(a przesunięcie bitowe zostanie ocenione przez kompilator, w związku z tym pozostanie tylko 510). Dlatego próbujesz przypisać wartość do byte
, która nie pasuje. Można maskować za pomocą 255:
byte b = (255 << 1) & 0xFF
, aby ponownie zmniejszyć wynik do 8 bitów. W przeciwieństwie do Java, C# nie pozwala, aby przepełnienia przechodziły niewykryte. Zasadniczo masz dwie rozsądne opcje, gdy próbujesz przypisać 510 do bajtu: albo zacisk na maksymalnej wartości, potem uzyskasz 255, albo wyrzuć bity, które nie pasują, w takim przypadku otrzymasz 254.
można również użyć unchecked
, jak lassevk mentioned:
byte b = unchecked((byte)(255 << 1));
Nie wiem, dlaczego myślałem, że 255 będzie przechowywane jako 8-bitowe –
Cóż, 255 pasuje, wszystko powyżej nie :) – Joey
Należy zauważyć, ponieważ zostałem popchnięty tutaj z innego wątku, że nawet jeśli masz dwa bajty, każda bitowa operacja na nich zwróci int. –