为什么铸造缩短为char是一个缩小的转换?

时间:2016-06-13 05:44:50

标签: java casting

缩小转换是指将可以容纳更大值的数据类型放入可以保持最大值较小的数据类型。

long l = 4L;
int i = (int)l;

但是,我不明白为什么简短的char是一个缩小的转换,但我的直觉是它与这两种数据类型的签名/无符号有关,但我无法解释原因。

short s = 4; // short max value is 32767
char c = (char)s; // char max value is 65535 

看起来它会是一个扩大的转换,或者至少既不会缩小也不会扩大,因为它们都是16位并且可以保持相同数量的值。

    System.out.println((int)Character.MIN_VALUE); //0
    System.out.println((int)Character.MAX_VALUE); //65535 
    System.out.println(Short.MIN_VALUE); //-32768
    System.out.println(Short.MAX_VALUE); //32767
    //65535 = 32768+32767

2 个答案:

答案 0 :(得分:6)

这是因为short能够保留负值,而char不是Character.MIN_VALUE所见。我举几个例子。

  short s = -124;
  char c = 124; // OK, no compile time error
  char d = -124; // NOT OK, compile time error since char cannot hold -ve values
  char e = s; // NOT OK, compile time error since a short might have -ve values which char won't be able to hold
  char f = (char)s; // OK, type casting. The negative number -124 gets converted to 65412 so that char can hold it
  System.out.println((short)f); // -124, gets converted back to a number short can hold because short won't be able to hold 65412
  System.out.println((int)f); // 65412, gets converted to 65412 because int can easily hold it.  

投放到-n时的(负)数字char变为2^16-n。所以,-124变成了 2^16-124 = 65412

我希望这会有所帮助。

答案 1 :(得分:2)

缩小的重点不在于位大小,而是在新类型中无法正确表示某些值。

正如您在最后一段代码中所示,Short.MIN_VALUE < Character.MIN_VALUE,即某些short值无法在char中表示。

由于你无法使用char忠实地表示负数(演员阵容会导致负数由2的补码表示,这不是相同的数字),我们认为演员“丢失了信息“因此缩小了。

来自Java Language Specification, §5.1.3

  

原始类型的22个特定转换称为缩小基元转换:

     
      
  • shortbytechar
  •   
  • charbyteshort
  •   
  • ...
  •   
     

缩小的原始转换可能会丢失有关数值整体幅度的信息,也可能会失去精度和范围。

     

...

     

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

     

char缩小转换为整数类型T同样只会丢弃除 n 最低位之外的所有位,其中 n 是用于表示类型T的位数。除了可能丢失有关数值大小的信息之外,这可能会导致结果值为负数,即使字符表示16位无符号整数值。