2013-02-18 10 views
7

jestem konwersji kodu, który działa w Javie, ale nie w C#Dlaczego nie można zapisać wartości ujemnej w zmiennej bajtowej?

byte[] buffer = new byte[64]; 
this.buffer[((int)this.count & 0x3F)] = -128; 

ten generuje błąd czasu kompilacji „Stała wartość«-128»nie mogą być zamienione na«bajt».” Jak mogę zapisać liczbę ujemną dla bajtu?

+7

'byte' C# jest _unsigned_ 8-bitowy. –

+1

sbyte .......... –

+0

@JohnWillemse powinieneś zrobić taką odpowiedź, chciałbym ją przegłosować. –

Odpowiedz

6

Typ danych w języku Java to podpisany (-128 – 127). Odpowiedni typ danych w języku C# to sbyte.

więc odpowiednik C# Kod jest następujący:

sbyte[] buffer = new sbyte[64]; 
buffer[..] = -128; 

Jeśli chcesz tablicą niepodpisanych bajtów (0 – 255), w byte z tym samym bitów jako sbyte -128 to 128 (0x80).

byte[] buffer = new byte[64]; 
buffer[..] = 128; 

Patrz również:Integral Types Table (C# Reference)

+1

Jako uzupełnienie można oczywiście zmusić obsadę do wykonania. Odbywa się to w ten sposób (gdy 'buffer' to' byte [] '): **' buffer [index] = niezaznaczone ((byte) (- 128)); '**' niezaznaczone (...) ' część może zostać pominięta, gdy spełnione są dwa warunki: _1: _ Wartością rzutowania jest ** nie ** stała czasu kompilacji, a _2: _ Kod jest ** nie ** skompilowany z ['/ checked' opcja kompilatora] (http://msdn.microsoft.com/en-us/library/h25wtyxf.aspx). W takich przypadkach wystarczy powiedzieć "buffer [index] = (byte) nonConstant;'. –

15

C#, A byte oznacza unsigned 8-bitową liczbę całkowitą, a zatem nie mogą posiadać wartość ujemną (prawidłowe wartości w zakresie od 0 do 255). Alternatywą jest sbyte, która jest 8-bitową liczbą całkowitą z podpisem (poprawne wartości z -128 do 127).