numeros - programacion java contador
En Java, ¿es el resultado de la adición de dos caracteres un int o un char? (8)
Aquí hay algo extraño, sin embargo. Las siguientes compilaciones:
char x;
x = ''a'' + ''b'';
Pero esto no:
char x;
x = ''a'';
x = x + ''b'';
Parecería que ambas expresiones (''a'' + ''b'' y x + ''b'') dan como resultado números enteros, mediante la siguiente prueba:
Object obj = ''a''+''b'';
System.out.println(obj.getClass().getName());
char x = ''a'';
Object obj2 = x+''b'';
System.out.println(obj2.getClass().getName());
Entonces, ¿por qué el segundo caso no compilaría? Por cierto, puedes arreglarlo lanzando la expresión completa como un char:
x = (char)(x+''b'');
Esto parece una incoherencia en la semántica de Java: cualquier expresión de char debe ser intercambiable con otra en cualquier contexto. ¿Alguien sabe de una manera de dar sentido a esto?
Cuando se agrega ''a'' + ''b''
, produce 195. ¿El tipo de datos de salida es char
o int
?
De acuerdo con las reglas de promoción binarias , si ninguno de los operandos es doble, flotante o largo, ambos se promocionan a int. Sin embargo, recomiendo encarecidamente no tratar el tipo de caracteres como numérico, ese tipo de derrotas su propósito.
El compilador de Java puede interpretarlo como uno.
Verifíquelo escribiendo un programa y buscando errores en el compilador:
public static void main(String[] args) {
int result1 = ''a'' + ''b'';
char result2 = ''a'' + ''b'';
}
Si es un char, la primera línea me dará un error y la segunda no. Si es un int, entonces ocurrirá lo contrario.
Lo compilé y obtuve ..... SIN ERRORES. Entonces Java acepta ambos.
Sin embargo, cuando los imprimí, obtuve:
int: 195
char: Ã
Lo que sucede es que cuando lo haces:
char result2 = ''a'' + ''b''
se realiza una conversión implícita (una "conversión primitiva de estrechamiento" de int a char ).
El resultado de agregar caracteres Java, cortos o bytes es un int :
Especificación del lenguaje Java sobre promoción numérica binaria :
- Si alguno de los operandos es de un tipo de referencia, se realiza la conversión de unboxing (§5.1.8). Entonces:
- Si cualquiera de los dos operandos es del tipo double, el otro se convierte a double.
- De lo contrario, si alguno de los operandos es de tipo float, el otro se convierte en float.
- De lo contrario, si cualquiera de los operandos es de tipo largo, el otro se convierte en largo.
- De lo contrario, ambos operandos se convierten a tipo int.
Pero tenga en cuenta lo que dice acerca de los operadores de asignación compuesta (como + =) :
El resultado de la operación binaria se convierte al tipo de la variable de la izquierda ... y el resultado de la conversión se almacena en la variable.
Por ejemplo:
char x = 1, y = 2;
x = x + y; // compile error: "possible loss of precision (found int, required char)"
x = (char)(x + y); // explicit cast back to char; OK
x += y; // compound operation-assignment; also OK
Una forma de averiguar el tipo de resultado, en general, es lanzarlo a un objeto y preguntarle de qué clase se trata:
System.out.println(((Object)(''a'' + ''b'')).getClass());
// outputs: class java.lang.Integer
Si le interesa el rendimiento, tenga en cuenta que el bytecode de Java ni siquiera tiene instrucciones dedicadas para la aritmética con los tipos de datos más pequeños. Por ejemplo, para agregar, hay instrucciones iadd
(para iadd
), ladd
(para longs), fadd
(para flotadores), dadd
(para dobles), y eso es todo. Para simular x += y
con los tipos más pequeños, el compilador usará iadd
y luego iadd
cero los bytes superiores del int usando una instrucción como i2c
("int to char"). Si la CPU nativa tiene instrucciones dedicadas para datos de 1 byte o 2 bytes, depende de la máquina virtual Java optimizar para eso en tiempo de ejecución.
Si desea concatenar caracteres como String en lugar de interpretarlos como un tipo numérico, existen muchas maneras de hacerlo. Lo más fácil es agregar un String vacío a la expresión, porque agregar un char y un String da como resultado una Cadena. Todas estas expresiones dan como resultado la cadena "ab"
:
-
''a'' + "" + ''b''
-
"" + ''a'' + ''b''
(esto funciona porque"" + ''a''
se evalúa primero, si el""
estuviera al final obtendríamos"195"
) -
new String(new char[] { ''a'', ''b'' })
-
new StringBuilder().append(''a'').append(''b'').toString()
-
String.format("%c%c", ''a'', ''b'')
Las operaciones aritméticas binarias en char
y byte
(y short
) promueven a int
- JLS 5.6.2.
Puede desear aprender las siguientes expresiones sobre char
.
char c=''A'';
int i=c+1;
System.out.println("i = "+i);
Esto es perfectamente válido en Java y devuelve 66
, el valor correspondiente del carácter (Unicode) de c+1
.
String temp="";
temp+=c;
System.out.println("temp = "+temp);
Esto es demasiado válido en Java y la variable variable tipo String acepta automáticamente c
de tipo char y produce temp=A
en la consola.
¡Todas las siguientes afirmaciones también son válidas en Java!
Integer intType=new Integer(c);
System.out.println("intType = "+intType);
Double doubleType=new Double(c);
System.out.println("doubleType = "+doubleType);
Float floatType=new Float(c);
System.out.println("floatType = "+floatType);
BigDecimal decimalType=new BigDecimal(c);
System.out.println("decimalType = "+decimalType);
Long longType=new Long(c);
System.out.println("longType = "+longType);
Aunque c
es un tipo de char
, se puede suministrar sin ningún error en los respectivos constructores y todas las declaraciones anteriores se tratan como declaraciones válidas. Ellos producen las siguientes salidas respectivamente.
intType = 65
doubleType = 65.0
floatType = 65.0
decimalType = 65
longType =65
char
es un tipo integral numérico primitivo y, como tal, está sujeto a todas las reglas de estas bestias, incluidas las conversiones y las promociones. Le recomendamos que lea sobre esto, y JLS es una de las mejores fuentes para esto: Conversiones y Promociones . En particular, lea el breve sobre "5.1.2 Ampliación de la conversión primitiva".
Si bien ya tienes la respuesta correcta (mencionada en el JLS), aquí hay un poco de código para verificar que obtienes un int
cuando se agregan dos caracteres.
public class CharAdditionTest
{
public static void main(String args[])
{
char a = ''a'';
char b = ''b'';
Object obj = a + b;
System.out.println(obj.getClass().getName());
}
}
El resultado es
java.lang.Integer
char
se representa como valores Unicode
y donde los valores Unicode están representados por /u
seguido de valores Hexadecimal
.
Como cualquier operación aritmética en valores char
promovida a int
, entonces el resultado de ''a'' + ''b''
se calcula como
1.) Aplicar los valores Unicode
en el char
correspondiente usando la Unicode Table
2.) Aplique la conversión hexadecimal a decimal y luego realice la operación en valores Decimal
.
char Unicode Decimal
a 0061 97
b 0062 98 +
195
Ejemplo
0061
(0 * 16 3 ) + (0 * 16 2 ) + (6 * 16 1 ) + (1 * 16 0 )
(0 * 4096) + (0 * 256) + (6 * 16) + (1 * 1)
0 + 0 + 96 + 1 = 97
0062
(0 * 16 3 ) + (0 * 16 2 ) + (6 * 16 1 ) + (2 * 16 0 )
(0 * 4096) + (0 * 256) + (6 * 16) + (2 * 1)
0 + 0 + 96 + 2 = 98
De ahí 97 + 98 = 195
Ejemplo 2
char Unicode Decimal
Ջ 054b 1355
À 00c0 192
--------
1547 +
1163 -
7 /
260160 *
11 %