在java中为什么我们不能直接将int分配给char?但反之亦然?

时间:2013-12-10 17:03:39

标签: java

public class CharAndIntTest {

    public static void main(String[] args) {
        char i='1';
        int ii=65;
        i=ii;
    }

}

4 个答案:

答案 0 :(得分:5)

int的容量大于char,因此无法保证转换有效。 char值的可能范围是0到65535,但int可以是-2147483648到2147483647之间的任何值。

但是,除了原始存储大小之外,还有其他一些注意事项。 char是无符号类型(实际上是Java唯一的内置无符号类型),因此即使shortbyte变量仍然需要转换为char,因为它们可能是负数。 shortchar都是16位,但由于short已签名,其范围与char的范围不同(short范围从-32,768到32,767)。

这里要学习的最重要的事情是 Java只允许隐式转换,如果可以绝对确定转换将成功。这适用于基元,对象,泛型等等。一切。

您可以使用强制转换强制转换:

char i='1';
int ii=65;
i=(char)ii; //explicit cast tells the compiler to force the int into a char

答案 1 :(得分:3)

分配转换(JLS, Section 5.2)允许原始扩展转换,但不允许原始缩小转换:

  

当表达式的值为时,发生分配转换   已赋予(第15.26节)变量:表达式的类型必须为   转换为变量的类型。

     

分配上下文允许使用以下之一:

     
      
  • 身份转换(第5.1.1节)

  •   
  • 扩大原始转换(第5.1.2节)

  •   
  • 扩大参考转换(第5.1.5节)

  •   
  • 拳击转换(§5.1.7),可选地后跟加宽   参考转换

  •   
  • 取消装箱转换(第5.1.8节),可选地后跟加宽   原始转换。

  •   

所以你必须强制转换才能执行原始的缩小转换,除非

  

另外,如果表达式是常量表达式(§15.28)   输入byte,short,char或int:

     
      
  • 如果类型为,则可以使用缩小的基元转换   变量是byte,short或char,以及常量的值   表达式可以在变量的类型中表示。
  •   

因此,分配文字将起作用:

char a = 65;

答案 2 :(得分:1)

char是16位数据类型,而int是32位数据类型。因此,某些可能的int值无法用char表示,而不会丢弃某些数据(截断)。编译器会创建一条错误消息,警告您意外截断可能导致的问题。

如果您进行了适当的投射,您仍然可以将int值分配给char

int i=500;
char c = (char)i;

您甚至可以像这样分配非法的char值,但结果仍会被截断:

int i = 65555;
char c = (char)i; //still compiles and doesn't cause an exception, but data is lost
i = c; //i's value is 19

答案 3 :(得分:0)

char是16位无符号数,因此它们的最大值为65,635
int是32位带符号的数字,最多只有2,147,483,647

如果您为所有值int签署char>= 65,635,那么某些内容肯定会出错。