char与int自动转换本质是Unicode码点数值映射,char占2字节无符号整数,转int自动提升,转char需强制截断低16位,字符串互转须用工具方法而非类型转换。

字符与整型的自动转换本质是 Unicode 码点映射
Java 中 char 是 16 位无符号整数类型,取值范围 0~65535,底层存储就是数字。所以 char c = 'A' 实际存的是 65;int i = c 不需要强制转换,编译器直接按码点值提升为 int。
这种转换不是“字符变数字”的语义操作,而是同一数值在不同表示方式下的自然映射。常见误区是认为 '0' 转成 int 就是 0 —— 实际上是 48,因为 ASCII/Unicode 中字符 '0' 的码点是 48。
char c = '5'; int n = c - '0'; // 得到 5(48→53,53−48=5)int code = '中'; // 得到 20013(UTF-16 编码值)- 运算中 char 总是先提升为 int,再参与计算,比如
char a='a', b='b'; int s = a + b;结果是 195(97+98)
强制转换需警惕截断与符号问题
从 int 转回 char 属于高→低容量转换,必须显式强制转换,且只保留低 16 位。超出 0~65535 范围时,等效于对 65536 取模。
例如:int x = 70000; char c = (char)x;,70000 % 65536 = 4464,对应某个 Unicode 字符(非 ASCII),但不会报错也不会提示。
立即学习“Java免费学习笔记(深入)”;
- 负数转 char 会得到高位全 1 的 16 位值,如
(char)(-1)→ 65535(即 '\uffff') -
int y = 300; char d = (char)y;→ 300(合法,仍在范围内) -
int z = 100000; char e = (char)z;→ 100000 % 65536 = 34464
内存占用固定,与转换行为无关
char 在 JVM 中恒占 2 字节(16 位),无论它存的是 'a'、'中' 还是通过强制转换得来的任意 16 位整数。int 恒占 4 字节(32 位)。这个大小由 JVM 规范定义,不随操作系统位数(32/64 位)改变。
所以 char → int 是扩展存储,补 0 即可;int → char 是截断存储,丢弃高 16 位。这不是“压缩”或“编码转换”,而是纯粹的位截取操作。
- char 的 2 字节始终解释为无符号整数(0~65535)
- int 的 4 字节是有符号整数(−2³¹~2³¹−1)
- 两者之间没有隐含的字符集解析逻辑——JVM 不关心你把它当字母还是当编号用
字符串与 char/int 互转不能靠类型转换
String 是引用类型,和基本类型 char、int 完全不兼容,不存在自动或强制类型转换。所有转换都依赖工具方法,且有明确语义:
-
String → char:用
str.charAt(0)或str.toCharArray()[0],前提是字符串非空 -
String → int:用
Integer.parseInt("123"),抛异常处理必须做 -
int → String:推荐
String.valueOf(123),安全支持 null;"" + 123也可,但隐式创建 StringBuilder -
char → String:用
String.valueOf('x')或Character.toString('x')
注意:像 (char)123 得到的是字符 '{',而 String.valueOf(123) 得到的是字符串 "123" —— 二者语义完全不同,不可混用。


















