Patrząc na ten kod C #:
byte x = 1;
byte y = 2;
byte z = x + y; // ERROR: Cannot implicitly convert type 'int' to 'byte'
Wynik dowolnej matematyki wykonanej na typach byte
(lub short
) jest domyślnie rzutowany z powrotem na liczbę całkowitą. Rozwiązaniem jest jawne przeniesienie wyniku z powrotem do bajtu:
byte z = (byte)(x + y); // this works
Zastanawiam się, dlaczego? Czy to jest architektoniczne? Filozoficzny?
Mamy:
int
+int
=int
long
+long
=long
float
+float
=float
double
+double
=double
Dlaczego więc nie:
byte
+byte
=byte
short
+short
=short
?
Trochę tła: wykonuję długą listę obliczeń dla „małych liczb” (tj. <8) i przechowuję wyniki pośrednie w dużej tablicy. Korzystanie z tablicy bajtów (zamiast tablicy int) jest szybsze (z powodu trafień w pamięci podręcznej). Ale rozległe rzutowania bajtów rozłożone w kodzie sprawiają, że jest on o wiele bardziej nieczytelny.
byte1 | byte2
wcale nie traktuje ich jak liczb. To traktuje je dokładnie jako wzory bitów. Rozumiem twój punkt widzenia, ale tak się składa, że za każdym razem, gdy robiłem jakąkolwiek arytmetykę na bajtach w C #, faktycznie traktowałem je jako bity, a nie liczby, a takie zachowanie zawsze przeszkadza.