Java中char与int转换需遵循隐式/显式规则:char→int自动拓宽,int→char必须强制转换并注意截断风险。

Java中char和int的转换不是“无缝”的,而是有明确规则的隐式/显式类型转换,关键在于理解它们的底层表示和转换逻辑。
char和int的本质区别
char是16位无符号整数(0到65535),用于表示Unicode字符;int是32位有符号整数(-2147483648到2147483647)。两者在0到65535范围内数值重叠,但语义不同:char强调字符意义,int强调数值意义。
自动转换只发生在特定方向
Java允许从char到int的**自动拓宽转换**(widening conversion),因为不会丢失信息:
- char c = 'A'; int i = c; // 合法,i值为65
- char c = '\uFFFF'; int i = c; // 合法,i值为65535
但反过来(int → char)必须**强制类型转换**,因为可能超出char范围或丢失符号信息:
立即学习“Java免费学习笔记(深入)”;
- int i = 65; char c = (char) i; // 合法,c为'A'
- int i = -1; char c = (char) i; // 合法但结果是'\uFFFF'(65535),不是直观预期
- int i = 70000; char c = (char) i; // 编译通过,运行时截断为70000 % 65536 = 4464
转换时的实际数值行为
char转int:直接提升为int,高位补0,值不变;
int转char:仅保留低16位(等价于 i & 0xFFFF),符号位被丢弃。
- (char) 65535 → '\uFFFF'
- (char) 65536 → '\u0000'(因为65536 & 0xFFFF == 0)
- (char) -1 → '\uFFFF'(-1的二进制补码低16位全为1)
安全转换的实用建议
若需确保int值能合理映射为char,应先做范围校验:
- 检查 int 值是否在 0–65535 之间再强转
- 用 if (i >= 0 && i 判断
- 避免对负数或大于65535的int直接强转,除非明确需要模运算效果
- 涉及字符处理时优先使用Character类的静态方法(如Character.isLetter()),而非依赖数值比较


















