public class CharAndIntTest {
public static void main(String[] args) {
char i='1';
int ii=65;
i=ii;
}
}
答案 0 :(得分:5)
int
的容量大于char
,因此无法保证转换有效。 char
值的可能范围是0到65535,但int
可以是-2147483648到2147483647之间的任何值。
但是,除了原始存储大小之外,还有其他一些注意事项。 char
是无符号类型(实际上是Java唯一的内置无符号类型),因此即使short
和byte
变量仍然需要转换为char
,因为它们可能是负数。 short
和char
都是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
,那么某些内容肯定会出错。