Java - 显式转换为char / short

时间:2013-09-18 10:51:30

标签: java

任何人都可以告诉我为什么这个显式转换会产生不同的结果,即使short / char的大小都是16位?

package jh;

public class Main {

  public static void main(String[] args) {

     byte b = (byte)255;

     System.out.println("Size of short: " + Short.SIZE);
     System.out.println("Size of char: " + Character.SIZE);

     System.out.println((int)((short)b));
     System.out.println((int)((char)b));        
   }
 }

输出:

Size of short: 16
Size of char: 16
-1
65535

3 个答案:

答案 0 :(得分:3)

来自Java datatypes doc

  

byte:字节数据类型是一个8位带符号的二进制补码整数。它的最小值 -128,最大值127(含)。字节数据类型可用于在大型阵列中保存内存,其中节省的内存实际上很重要。它们也可用于代替int,其限制有助于澄清您的代码;变量范围有限的事实可以作为一种文档形式。

     

短:短数据类型是一个16位带符号的二进制补码整数。它的最小值 -32,768,最大值为32,767(含)。与字节一样,相同的准则也适用:在内存节省实际上很重要的情况下,您可以使用short来节省大型阵列中的内存。

     

char: char数据类型是一个16位Unicode字符。它的最小值为'\ u0000'(或0),最大值为'\ uffff'(或65,535(含))

所以在(原谅双关语),按位,它们是相同的。但char表示与short相同的位模式的数值

这也伴随着符号扩展功能:(byte) 255意味着一个字节值,所有位都设置为0b11111111,在twos complement中为-1。向上转换时,Java执行符号扩展操作,因此如果符号位为0,则所有较高位也为0,但当符号位为1时,所有较高位也为1。这意味着-1表示所有已签名的整数数据类型中的-1(在此示例中为0b1111111111111111的{​​{1}})。但不是char - 当所有位都设置时,等于正的最大值 - 65535。

答案 1 :(得分:3)

byte已签名且仅包含值-128..127。分配255时,它会回绕并变为-1

(short)b-1

char但是Java中唯一的无符号类型,它的值为0..65535,因此(char)-1再次回绕并变为65535

答案 2 :(得分:0)

byte b = (byte)255;这会将值{-1}分配给b,因为byte已签名。当你将-1转换为short时,你得到-1。当你将-1转换为char时,得到65535,因为char的范围介于0到65535之间