在C++中,char本质是小整数,直接用int强制转换即可获取其ASCII值,如char c = 'A'; std::cout << (int)c; 输出65。

直接用 int 强制转换就能拿到 ASCII 值
字符在 C++ 里本质就是小整数,char 类型变量存的就是它的编码值(通常是 ASCII)。想看某个字符对应的数字,最简单就是把它转成 int:
char c = 'A'; std::cout << (int)c << std::endl; // 输出 65
注意括号不能省——std::cout 是语法错误,必须写成 <code>(int)c 或更推荐的 static_cast<int>(c)</int>。
std::cout 默认会把 char 当字符输出,不是数字
这是新手最常踩的坑:直接 std::cout 永远显示字符本身(比如 <code>'A'),而不是 65。因为 std::cout 对 char 有特化重载,优先走字符路径。
- 要输出数字值,必须显式转换类型,不能依赖隐式提升
- 如果误写成
std::cout (一元加),它确实能触发整型提升,但可读性差、语义模糊,不建议 - 对
unsigned char同样适用,但要注意符号扩展问题:若char是有符号且值为负(如\xFF),直接转int会得到负数(-1),此时应先转unsigned char再转int
处理非 ASCII 字符(如中文、emoji)要小心
标准 char 只能表示单字节值,UTF-8 中文通常占 3 字节,一个 char 变量根本存不下完整字符——你取到的只是第一个字节的值(比如 '中' 的 UTF-8 首字节是 0xE4,即 228)。
立即学习“C++免费学习笔记(深入)”;
- 别指望
(int)'中'能得到 Unicode 码点(U+4E2D = 20013) - 真要处理 Unicode,得用
char32_t+u32string,或借助 ICU、UTF8-CPP 等库解析 UTF-8 字节序列 - 命令行终端编码、源文件保存编码(UTF-8 vs GBK)也会影响字面量解释,编译时可能报错或静默截断
用 static_cast 比 C 风格强制转换更安全
C++ 推荐用 static_cast 显式表达“我知道这是数值转换”,编译器会做基本合法性检查:
char c = 'z'; int val = static_cast<int>(c); // 清晰、安全、可搜 // 对比:int val = (int)c; —— C 风格,难定位、易误改
如果后续换成宽字符(wchar_t),static_cast 还能自然过渡;而 C 风格转换在模板或重载场景下容易引发意外行为。
真正麻烦的从来不是怎么转,而是没意识到字符字面量的编码依赖环境,以及 char 类型默认有无符号性由编译器决定——这两点在跨平台或读二进制数据时最容易出 silent bug。


















