En regardant ce code C #:
byte x = 1;
byte y = 2;
byte z = x + y; // ERROR: Cannot implicitly convert type 'int' to 'byte'
Le résultat de tout calcul effectué sur byte
(ou short
) les types est implicitement restitué en entier. La solution consiste à convertir explicitement le résultat en octet:
byte z = (byte)(x + y); // this works
Je me demande pourquoi? Est-ce architectural? Philosophique?
On a:
int
+int
=int
long
+long
=long
float
+float
=float
double
+double
=double
Alors pourquoi pas:
byte
+byte
=byte
short
+short
=short
?
Un peu de contexte: j'effectue une longue liste de calculs sur des "petits nombres" (c'est-à-dire <8) et je stocke les résultats intermédiaires dans un grand tableau. L'utilisation d'un tableau d'octets (au lieu d'un tableau int) est plus rapide (en raison des accès au cache). Mais les octets étendus diffusés dans le code le rendent encore plus illisible.
byte1 | byte2
ne les traite pas du tout comme des nombres. Cela les traite précisément comme des modèles de bits. Je comprends votre point de vue, mais il se trouve que chaque fois que je faisais de l'arithmétique sur des octets en C #, je les traitais en fait comme des bits, pas des nombres, et ce comportement est toujours gênant.