为何两个char类型变量相加后C语言程序输出负值?
问题解答
首先拆解问题的核心原因:
- 字符的ASCII值计算:
'a'的ASCII码是97,'b'是98,两者相加结果为97 + 98 = 195。 char类型的符号属性:C语言标准未强制规定char的符号性,但绝大多数主流编译器(如GCC、MSVC)默认将char视为有符号字符类型(signed char),其取值范围是-128 ~ 127。- 有符号整数溢出:195超出了
signed char的最大值127,触发有符号整数溢出。按二进制补码规则,195的8位二进制是11000011,最高位的1作为符号位表示负数,转换为十进制即为-61——这就是程序输出负值的直接原因。
验证与解决方法
如果想要得到预期的正数值,可通过以下方式修改代码:
- 将
char改为unsigned char,其取值范围为0 ~ 255,能容纳195的结果:
#include <stdio.h> int main() { unsigned char a = 'a', b = 'b', c; c = a + b; printf("%d", c); // 输出195 }
- 或者用
int类型存储相加结果,避免截断:
#include <stdio.h> int main() { char a = 'a', b = 'b'; int c; c = a + b; // a和b会自动提升为int类型,相加结果无溢出 printf("%d", c); // 输出195 }
内容的提问来源于stack exchange,提问作者Ndm Bcc
相关产品推荐
相关产品推荐

