解释这个Java程序如何打印65535

时间:2015-11-07 00:57:26

标签: java

这是主要方法的类。

import java.util.*; 
import java.io.*;
class Main {
    public static void main(String args[])
        System.out.println((int)(char)(byte)-1);
    }
}

请解释如何打印结果“65535”。

2 个答案:

答案 0 :(得分:2)

根据 Java语言规范,让我们关注它:

-1

Integer Literals

  

如果整数文字的后缀为ASCII字母longL(ell),则其类型为l;否则它是int§4.2.1)类型。

所以在十六进制中意味着:

0xFFFFFFFF {int -1}
(byte)0xFFFFFFFF

Narrowing Primitive Conversionintbyte):

  

将有符号整数缩小为整数类型T只会丢弃除 n 最低位之外的所有位,其中 n 是用于表示类型的位数T.除了可能丢失有关数值大小的信息外,这可能会导致结果值的符号与输入值的符号不同。

0xFFFFFFFF {int -1}  →  0xFF {byte -1}
(char)0xFF

Widening and Narrowing Primitive Conversionbytechar):

  

首先,byte通过扩展原始转换(§5.1.2)转换为int,然后生成的int转换为char通过缩小原始转换(§5.1.3)。

Widening Primitive Conversionbyteint):

  

将有符号整数值扩展为整数类型T只需对整数值的两个补码表示进行符号扩展,以填充更宽的格式。

0xFF {byte -1}  →  0xFFFFFFFF {int -1}

Narrowing Primitive Conversionintchar):

  

将有符号整数缩小转换为整数类型T只会丢弃除 n 最低位以外的所有位,[...]

0xFFFFFFFF {int -1}  →  0xFFFF {char 65535}
(int)0xFFFF

Widening Primitive Conversioncharint):

  

char的扩展转换为整数类型T归零扩展char值的表示以填充更宽的格式。

0xFFFF {char 65535}  →  0x0000FFFF {int 65535}

结果:65535

答案 1 :(得分:1)

char未签名。 -1(整数为负数)变为Character.MAX_VALUE(因为arithmetic underflow)。它相当于

System.out.println((int) Character.MAX_VALUE);

因此你得到(也许是令人惊讶的)65535