Rompecabezas Java Multicasting (Typecasting varias veces)

Encuentre la salida del programa.

public class Multicast {
    public static void main(String[] args) {
    System.out.println((int) (char) (byte) -1);
    }
}

Este programa es confuso de cualquier forma que lo cortes. Comienza con el valor int -1, luego convierte el int en un byte, luego en un char y finalmente vuelve a un int. El primer lanzamiento reduce el valor de 32 bits a 8, el segundo lo amplía de 8 bits a 16 y el último lanzamiento lo amplía de 16 bits a 32. ¿Termina el valor donde empezó? Si ejecutó el programa, descubrió que no lo hace. Imprime 65535
Entendamos esto paso a paso:-
1. El comportamiento del programa depende críticamente del comportamiento de extensión de signo de los moldes. Java usa aritmética binaria en complemento a dos, por lo que el valor int -1 tiene los 32 bits establecidos.

2. La conversión de int a byte es sencilla. Realiza una conversión primitiva de estrechamiento, que simplemente elimina todos menos los 8 bits de orden inferior. Esto deja un valor de byte con los 8 bits establecidos, que (todavía) representa -1.

3. La conversión de byte a char es más complicada porque byte es un tipo firmado y char no firmado . Por lo general, es posible convertir de un tipo integral a uno más amplio conservando el valor numérico, pero es imposible representar un valor de byte negativo como un carácter. Por lo tanto, la conversión de byte a char no se considera una conversión primitiva de ampliación, sino una conversión primitiva de ampliación y reducción: el byte se convierte en un int y el int en un char.
Todo esto puede sonar un poco complicado. Afortunadamente, existe una regla simple que describe el comportamiento de la extensión de signo cuando se convierte de tipos integrales más estrechos a tipos más anchos: la extensión de signo se realiza si el tipo del valor original tiene signo; extensión cero si es un char, independientemente del tipo al que se esté convirtiendo. Conocer esta regla facilita la resolución del rompecabezas. Dado que el byte es un tipo con signo, la extensión del signo se produce al convertir el valor de byte -1 en un carácter. El valor char resultante tiene los 16 bits establecidos, por lo que es igual a 65.535.

4. La conversión de char a int también es una conversión primitiva de ampliación, por lo que la regla nos dice que se realiza una extensión de cero en lugar de una extensión de signo.
El valor int resultante es 65535, que es justo lo que imprime el programa.

Referencias:
Libro Java Puzzlers

Este artículo es una contribución de Shubham Juneja . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *