char本质是整数,java中为16位unicode码点,c/c++中为8位ascii值;char与int互转是数值映射而非字符解析,数字字符转整数需c-'0',整数转数字字符需(char)(n+'0');处理unicode需用codepointat避免代理对问题。

char 本质是整数,不是“字符符号”
Java 和 C/C++ 中的 char 不是抽象的字符概念,而是 16 位(Java)或 8 位(C/C++)的整数类型。它在内存里存的就是一个数字:'A' 存的是 65,'0' 存的是 48,'中' 存的是 20013(Unicode 码点)。所谓“转换”,其实是同一组二进制数据被不同类型的变量读取——就像用尺子量同一段长度,单位换算而已,不涉及解析、查表或运行时逻辑。
char → int:自动拓宽,得码点值
把 char 赋给 int 是安全的隐式转换,JVM 或编译器直接取其原始数值(码点),不丢失精度:
-
char c = '7'; int i = c;→i == 55(不是 7) -
char c = '€'; int i = c;→i == 8364(欧元符号 Unicode 码点) - 想把数字字符 '0'~'9' 变成对应整数 0~9,必须写
c - '0',即 55 - 48 = 7 - 别写
c - 0,语义错误且易混淆;非数字字符(如 '+'、空格)减 '0' 没业务意义
int → char:需范围检查,截断静默发生
把 int 赋给 char 属于窄化转换,有明确边界和风险:
- 值在 0~65535 内(如 65、97、20013),可直接赋值:
char c = 65;→ 'A' - 值超出范围(如 70000),编译器报错;强制转换
(char)70000会取低 16 位:70000 & 0xFFFF == 4464,对应字符不可预测 - 想把整数 5 变成字符 '5',要写
(char)(5 + '0'),即 5 + 48 = 53 → '\u0035' - 别写
(char)5,那是控制符 ENQ,不是数字字符
处理真实文本时,别只盯着 charAt
String 的 charAt(i) 返回的是单个 char,但现代 Unicode 中很多字符(如 emoji、生僻汉字)由两个 char 组成(代理对)。仅用 charAt 可能只拿到一半:
-
"?".charAt(0)返回高位代理,不是完整 thumbs-up - 应改用
str.codePointAt(i)获取完整码点(int 值) - 配合
Character.isSurrogatePair(str.charAt(i), str.charAt(i+1))判断是否为代理对 - 否则你转出来的 int 值可能既不是字母也不是数字,只是一个无效的半边码点











