En cuanto a la motivación: Imaginemos que las alternativas a este comportamiento y ver por qué no funcionan:
Alternativa 1: el resultado siempre debe ser el mismo que las entradas .
¿Cuál debería ser el resultado de agregar un int y un short?
¿Cuál debería ser el resultado de multiplicar dos pantalones cortos? El resultado en general se ajustará a un int, pero como truncamos a corto, la mayoría de las multiplicaciones fallarán en silencio. Casting a un int después no ayudará.
Alternativa 2: el resultado siempre debe ser el tipo más pequeño que pueda representar todas las salidas posibles.
Si el tipo de devolución fue corto, la respuesta no siempre podría ser representativa.
Un valor bajo puede contener valores -32,768 a 32,767. Entonces, este resultado causará desbordamiento:
short result = -32768/-1; // 32768: not a short
Así que su pregunta es: ¿por qué la adición de dos ints no devuelve un largo? ¿Qué debería ser la multiplicación de dos puntos? Un largo? ¿Un BigNumber para cubrir el caso de cuadrar el valor mínimo entero?
Alternativa 3: Elija lo más probable que las personas quieren mayor parte del tiempo
Así, el resultado debería ser:
- int para multiplicar dos cortos, o cualquier operaciones int.
- corto si se suman o restan cortos, dividiendo un corto por cualquier tipo de entero, multiplicando dos bytes, ...
- byte si bitshifting un byte a la derecha, int si bitshifting a la izquierda.
- etc ...
recordando todos los casos especiales serían difíciles si no hay una lógica fundamental para ellos. Es más simple decir: el resultado de operaciones enteras es siempre un int.
Porque convertir un int en un corto daría una posible pérdida de precisión. (-32768/-1) –