【发布时间】:2013-12-28 08:04:15
【问题描述】:
public class CharAndIntTest {
public static void main(String[] args) {
char i='1';
int ii=65;
i=ii;
}
}
【问题讨论】:
-
看看here
标签: java
public class CharAndIntTest {
public static void main(String[] args) {
char i='1';
int ii=65;
i=ii;
}
}
【问题讨论】:
标签: java
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
【讨论】:
chars 是 16 位无符号数,所以最多有 65,635。ints 是 32 位有符号数,所以最多有 2,147,483,647。
因此,如果您将int 签名为char,对于所有值>= 65,635,肯定会出现问题。
【讨论】:
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
【讨论】:
赋值转换 (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;
【讨论】: