bitweise Operationen geben einen Wert vom Typ int
(sig). Signed Ganzzahlen verwenden Two's-Komplement, um negative Zahlen darzustellen. Die Zeichenerweiterung wird verwendet, wenn von Byte zu Int gewechselt wird.
byte a = 1; // 0b00000001
int notA = ~a; // 0b11111110 = -128 + 64 + 32 + 16 + 8 + 4 + 2 = -2 (actually 0b11111111 11111111 11111111 11111110)
byte b = 9; // 0b00001001
int notB = ~9; // 0b11110110 = -128 + 64 + 32 + 16 + 4 + 2 = -10 (actually 0b11111111 11111111 11111111 11110110)
Casting zurück zu Byte geben Ihnen die "erwartete" Ergebnis für 0b11110110
byte notB = unchecked((byte)(~b)); // 0b11110110 = 128 + 64 + 32 + 16 + 4 + 2
Console.WriteLine(notB); // 246
Sie erkennen, dass "Byte" hat 8 Bits, also die binäre Darstellung von 9 ist 0b00001001? – Timbo
-2 ist eigentlich in Ordnung, da ints verwenden ... nun, @knittl sagte es gerade unten. – Shark
Dies ist nicht spezifisch für C# - die CPUs selbst arbeiten auf diese Weise –