Mirando este código C #:
byte x = 1;
byte y = 2;
byte z = x + y; // ERROR: Cannot implicitly convert type 'int' to 'byte'
El resultado de cualquier matemática realizada en byte
(o short
) tipos se devuelve implícitamente a un entero. La solución es devolver explícitamente el resultado a un byte:
byte z = (byte)(x + y); // this works
Lo que me pregunto es por qué. ¿Es arquitectónico? ¿Filosófico?
Tenemos:
int
+int
=int
long
+long
=long
float
+float
=float
double
+double
=double
Entonces por qué no:
byte
+byte
=byte
short
+short
=short
?
Un poco de antecedentes: estoy realizando una larga lista de cálculos sobre "números pequeños" (es decir, <8) y almacenando los resultados intermedios en una gran matriz. Usar una matriz de bytes (en lugar de una matriz int) es más rápido (debido a los éxitos de caché). Pero los extensos conjuntos de bytes distribuidos a través del código lo hacen mucho más ilegible.
byte1 | byte2
no los trata en absoluto como números. Esto los trata con precisión como patrones de bits. Entiendo su punto de vista, pero sucede que cada vez que hice aritmética en bytes en C #, en realidad los estaba tratando como bits, no como números, y este comportamiento siempre está en el camino.