Глядя на этот код C #:
byte x = 1;
byte y = 2;
byte z = x + y; // ERROR: Cannot implicitly convert type 'int' to 'byte'
Результат любой математики, выполненной с byte
(или short
) типами, неявно приводится к целому числу. Решением является явное приведение результата обратно к байту:
byte z = (byte)(x + y); // this works
Что мне интересно, почему? Это архитектурно? Философская?
У нас есть:
int
+int
=int
long
+long
=long
float
+float
=float
double
+double
=double
Так почему не:
byte
+byte
=byte
short
+short
=short
?
Немного предыстории: я выполняю длинный список вычислений для «малых чисел» (т.е. <8) и сохраняю промежуточные результаты в большом массиве. Использование байтового массива (вместо массива int) происходит быстрее (из-за попаданий в кэш). Но обширные броски байтов, распространяемые по коду, делают его намного более нечитаемым.
byte1 | byte2
вовсе не рассматривает их как числа. Это относится к ним как к шаблонам битов. Я понимаю вашу точку зрения, но так получилось, что каждый раз, когда я выполнял какие-либо арифметические действия с байтами в C #, я фактически рассматривал их как биты, а не числа, и такое поведение всегда мешает.