You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

char转ASCII码的行为疑问:为何计算结果与预期不符?

char类型运算后的异常输出解析

问题场景

char tmp;

tmp = 'A' + 'A';

cout << (int) 'A' + 'A' << endl; // 输出130
cout << (int) tmp << endl;       // 输出-126
cout << tmp;                     // 输出�

提问者预期(int) tmp输出130,实际得到-126,且输出字符不是扩展ASCII中的é而是乱码,疑惑是否因为进入扩展ASCII区域,还有其他遗漏点。

核心原因解析

  • char的符号属性导致溢出:绝大多数编译器中,char是有符号8位整数(取值范围-128到127)。'A'的ASCII值为65,65+65=130,超出了有符号char的最大值127,触发整数溢出。
  • 补码规则下的数值转换:130的二进制为10000010,对于有符号8位整数,最高位是符号位,这个二进制按补码规则解析就是-126(对10000010取反加1得到原码01111110,对应十进制126,加上符号位即为-126)。因此将tmp强转为int时,会保留这个符号扩展后的值,输出-126。
  • 字符乱码的本质:你预期的é是ISO-8859-1(扩展ASCII)编码中值为130的字符,但当前环境下cout默认使用的是UTF-8编码。UTF-8中,单字节字符仅支持0-127,130属于无效的单字节序列,因此会显示为�这种通用替换字符。

补充说明

  • 若要让tmp存储130并正确输出é,可将char改为unsigned char(取值范围0-255,能容纳130),强转int后会输出130;同时需将终端字符编码设置为ISO-8859-1或兼容编码。
  • 不同编译器对char的符号性可能有差异,例如部分编译器默认char为无符号类型,但GCC、MSVC等主流编译器默认是有符号char。

内容的提问来源于stack exchange,提问作者ela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:01:04