char本质是16位无符号整数,存储unicode码点值;char与int转换是同一二进制数据的不同解读:char→int自动拓宽得码点,数字字符转数值需减'0',int→char需范围检查或强制截断取低16位。

char 本质是整数,不是“字符符号”
Java 中的 char 是 16 位无符号整数类型,取值范围为 0 到 65535(即 Unicode 码点 \u0000 到 \uffff)。它在内存中存储的就是一个数字,比如 'A' 存的是 65,'0' 存的是 48,'中' 存的是 20013。所以 char 和 int 的转换,不是“解析字符”,而是对同一组二进制数据的**不同解读**。
char → int:自动拓宽,得码点值
把 char 赋给 int 变量时,Java 自动完成拓宽转换(widening conversion),不需强制类型转换:
-
char c = '7'; int i = c;→i的值是 55('7' 的 Unicode 码点) - 这个操作适用于任意字符,不只是数字;'a'、'€'、'你' 都能转出对应码点
- 因为 int(32 位)范围远大于 char(16 位),不会丢失数据,属于安全转换
数字字符 → 对应整数:要减 '0'
如果目标是把字符 '0'~'9' 转成整数 0~9,不能直接赋值,得用算术偏移:
-
char c = '7'; int digit = c - '0';→digit是 7 - 原理:'0'~'9' 在 Unicode 中连续排列(码点 48~57),相减即得数值差
- 更稳妥可用
Character.getNumericValue(c),它还支持 'a'~'z'、'A'~'Z' 等(返回 10~35)
int → char:范围检查 + 截断规则
把 int 赋给 char 分两种情况:
- 值在 0~65535 内(如 65、97),可直接赋值:
char c = 65;→ 得 'A' - 值超出范围(如 70000),编译报错;必须强制转换:
char c = (char)70000; - 强制转换时,Java 取 int 的低 16 位(等价于
& 0xFFFF),70000 & 0xFFFF = 4464,对应字符可能是某个生僻字或控制符
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











