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
相关产品推荐
相关产品推荐

