2013-02-18 9 views
7

I-Code bin Umwandlung, die in Java funktioniert aber nicht in C#Warum kann ich keinen negativen Wert in einer Bytevariablen speichern?

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

Dieser eine Fehler der Kompilierung erzeugt „Konstanter Wert‚-128‘kann nicht auf ein‚Byte‘umgewandelt werden.“ Wie kann ich eine negative Zahl für ein Byte speichern?

+7

A 'byte' in C# ist ein _unsigned_ 8-Bit-Integer. –

+1

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

+0

@JohnWillemse Sie sollten das eine Antwort machen, ich würde es aufwerten. –

Antwort

6

Der byte Datentyp in Java ist unterzeichnet (-128 – 127). Der entsprechende Datentyp in C# ist sbyte.

So entspricht C# -Code ist wie folgt:

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

Wenn Sie ein Array von unsigned Bytes wollen (0 – 255), die byte mit dem gleichen Bitmuster als sbyte -128 128 (0x80).

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

Siehe auch:Integral Types Table (C# Reference)

+1

Um zu ergänzen, kann man natürlich auch die Besetzung erzwingen. Dies geschieht wie folgt (wenn 'buffer' ein' byte [] 'ist): **' buffer [index] = unchecked ((byte) (- 128)); '** Das' unchecked (...) ' Der Teil kann weggelassen werden, wenn zwei Bedingungen erfüllt sind: _1: _ Der zu übertragende Wert ist ** nicht ** eine Kompilierzeitkonstante und _2: _ Der Code ist ** nicht ** mit ['/ checked] kompiliert Compiler-Option] (http://msdn.microsoft.com/en-us/library/h25wtyxf.aspx). Also würden Sie in diesen Fällen einfach sagen 'buffer [index] = (byte) nonConstant;'. –

15

In C#, ein byte stellt eine unsigned 8-Bit-Ganzzahl ist, und kann daher keinen negativen Wert (gültige Werte reichen 0-255) halten. Eine Alternative ist sbyte, die eine signierte 8-Bit-Ganzzahl (gültige Werte von -128 bis 127) ist.

Verwandte Themen