Como se explica en breve C # (pero también para otros compiladores de lenguajes, como Java)
Hay una conversión implícita predefinida de short a int, long, float, double o decimal.
No puede convertir implícitamente tipos numéricos no literales de tamaño de almacenamiento más grande en cortos (consulte la Tabla de tipos integrales para conocer los tamaños de almacenamiento de los tipos integrales). Considere, por ejemplo, las siguientes dos variables cortas xey:
short x = 5, y = 12;
La siguiente declaración de asignación producirá un error de compilación, porque la expresión aritmética en el lado derecho del operador de asignación se evalúa como int por defecto.
short z = x + y;
Para solucionar este problema, use un yeso:
short z = (short)(x + y);
Sin embargo, es posible utilizar las siguientes declaraciones, donde la variable de destino tiene el mismo tamaño de almacenamiento o un tamaño de almacenamiento mayor:
int m = x + y;
long n = x + y;
Una buena pregunta de seguimiento es:
"¿Por qué la expresión aritmética en el lado derecho del operador de asignación se evalúa como int por defecto"?
Una primera respuesta se puede encontrar en:
Clasificación y verificación formal de plegado constante de enteros
La especificación del lenguaje Java define exactamente cómo se representan los números enteros y cómo se evaluarán las expresiones aritméticas de enteros . Esta es una propiedad importante de Java, ya que este lenguaje de programación ha sido diseñado para ser utilizado en aplicaciones distribuidas en Internet. Se requiere un programa Java para producir el mismo resultado independientemente de la máquina de destino que lo ejecute .
Por el contrario, C (y la mayoría de los lenguajes de programación imperativos y orientados a objetos ampliamente utilizados) es más descuidado y deja abiertas muchas características importantes. La intención detrás de esta especificación de lenguaje inexacta es clara. Se supone que los mismos programas en C se ejecutan en una arquitectura de 16 bits, 32 bits o incluso 64 bits al crear instancias de la aritmética entera de los programas fuente con las operaciones aritméticas integradas en el procesador de destino. Esto conduce a un código mucho más eficiente porque puede usar las operaciones de la máquina disponibles directamente. Siempre que los cálculos de números enteros se ocupen únicamente de que los números sean "suficientemente pequeños", no surgirán inconsistencias.
En este sentido, la aritmética de enteros en C es un marcador de posición que no está definido exactamente por la especificación del lenguaje de programación, sino que solo se instancia completamente al determinar la máquina de destino.
Java define con precisión cómo se representan los enteros y cómo se calcula la aritmética de enteros.
Java Integers
--------------------------
Signed | Unsigned
--------------------------
long (64-bit) |
int (32-bit) |
short (16-bit) | char (16-bit)
byte (8-bit) |
Char es el único tipo de entero sin signo. Sus valores representan caracteres Unicode, de \u0000
a \uffff
, es decir, de 0 a 2 16 −1.
Si un operador entero tiene un operando de tipo long, entonces el otro operando también se convierte a tipo long. De lo contrario, la operación se realiza en operandos de tipo int, si es necesario, los operandos más cortos se convierten en int . Las reglas de conversión se especifican exactamente.
[De Electronic Notes in Theoretical Computer Science 82 No. 2 (2003)
Blesner-Blech-COCV 2003: Sabine GLESNER , Jan Olaf BLECH,
Fakultät für Informatik,
Universität Karlsruhe
Karlsruhe, Alemania]
T a, b; a += b
es equivalente aT a, b; a = (T) (a + b)
: observe la conversión agregada por el compilador.