Supongo que es una cuestión básica, pero ¿por qué no hay Sload instrucción? ¿Por qué se puede cargar todas las primitivas además corta? (Hay saload , pero aún así ...)
Por :
public class ShortTest {
public void test() {
short i = 1;
System.out.print(i);
}
}
Compilador sigue utilizando iload_1 . ¿Es porque es corta Tipo de procesadores de 16 bits y de 32 bits manejar mejor (ya que todos los procesadores modernos son de 32 / 64bits)?
Consulte la especificación de JVM, §2.11.1. Tipos y la Máquina Virtual de Java :
Tenga en cuenta que la mayoría de las instrucciones que aparecen en la tabla 2.11.1-A no tienen formularios para los tipos integrales
byte
,char
yshort
. Ninguno tiene formas para elboolean
tipo. Un compilador codifica un montón de valores literales de tiposbyte
yshort
el uso de Java Virtual Machine instrucciones de inicio de sesión que se extiende esos valores a valores de tipoint
en tiempo de compilación o en tiempo de ejecución. Las cargas de valores literales de tiposboolean
ychar
se codifican utilizando instrucciones que cero se extienden el literal a un valor de tipoint
en tiempo de compilación o de tiempo de ejecución. Del mismo modo, las cargas de las matrices de valores de tipoboolean
,byte
,short
, ychar
son codificadas utilizando las instrucciones Java Virtual Machine que el inicio de sesión se extienden o cero extender los valores para valores de tipoint
. Por lo tanto, la mayoría de las operaciones en valores de tipos realesboolean
,byte
,char
, yshort
se llevan a cabo correctamente por las instrucciones de funcionamiento en valores de tipo computacionalint
.
Vale la pena recordar que en Java, cualquier aritmética de enteros que no impliquen long
tendrá un int
resultado, independientemente de si la entrada es byte
, char
, short
, o int
.
Así que una línea como
short i = 1, j = 2, k = i + j;
no se compilará, pero requieren un molde tipo, como
short i = 1, j = 2, k = (short)(i + j);
Y este tipo fundido será el único indicador que short
está involucrado. Dejando a un lado consejos de depuración, no hay ninguna declaración formal de variables locales en el código de bytes, pero sólo asignaciones de valores que determinan su tipo. Así que las variables locales de tipo short
simplemente no existen. El código anterior se compila a
0: iconst_1
1: istore_1
2: iconst_2
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: i2s
8: istore_3
que es idéntica a la forma compilada de
int i = 1, j = 2, k = (short)(i + j);
Pero cuenta que el tipo en tiempo de compilación de las variables puede cambiar el método que el compilador elige para una invocación en caso de sobrecargas. Lo cual es especialmente importante si los tipos llevan una semántica diferente, al igual que en el caso de print(boolean)
o print(char)
. Mientras que el valor pasado al método tiene un int
tipo en cualquiera de los casos, el resultado es completamente diferente.
Otro ejemplo de las diferencias impuesta por el compilador es
{
int i = 1;
i++;
}
{
short s = 1;
s++;
}
el cual se compila a
0: iconst_1
1: istore_1
2: iinc 1, 1
5: iconst_1
6: istore_1
7: iload_1
8: iconst_1
9: iadd
10: i2s
11: istore_1
Por lo tanto, ya que el cálculo se realiza siempre en 32 bits, el compilador inserta el código necesario para truncar el resultado que short
para el segundo incremento. Nota de nuevo la ausencia de declaraciones de variables, por lo que el código es idéntico a la forma compilada de
int i = 1;
i++;
i = 1;
i = (short)(i+1);
También vale la pena mirar el Sistema Tipo de verificación , ya que el verificador comprobará la validez de todas las transferencias desde y hacia las variables locales:
El tipo de corrector hace cumplir un sistema de tipo basado en una jerarquía de verificación tipos, se ilustra a continuación.
Verification type hierarchy: top ____________/\____________ / \ / \ oneWord twoWord / | \ / \ / | \ / \ int float reference long double / \ / \_____________ / \ / \ uninitialized +------------------+ / \ | Java reference | / \ | type hierarchy | uninitializedThis uninitialized(Offset) +------------------+ | | null
Por lo que el sistema de tipos se simplifica, en comparación con los tipos de lenguaje Java, y el verificador no le importa, por ejemplo, si se pasa un boolean
valor a un método esperando una char
, ya que ambos son int
tipos.