char与整数相加后按float格式打印得到0值的问题咨询
核心成因
你遇到的问题本质是printf的格式说明符和实际传入参数的类型不匹配,触发了C语言标准定义的未定义行为,输出结果没有任何规范约束,你观察到的固定输出0只是当前编译环境、运行平台下的偶然表现。
类型不匹配的具体逻辑
- C语言中
char类型和int类型做算术运算时,char会先默认提升为int类型,因此z + y的计算结果类型是int。 printf的%f格式说明符要求传入的参数是double类型(C语言可变参数传参时,float会自动提升为double),传入int类型完全不符合要求。
为什么你这里会固定输出0
这个表现和当前平台的函数调用约定强相关:
主流x86-64平台的可变参数传参规则是,整数类参数通过通用寄存器传递,浮点数类参数通过XMM系列寄存器传递。你给%f传入了整数参数,printf会按规则读取对应位置的XMM寄存器的值,而你没有主动给该寄存器赋值,其初始值刚好为0,就会输出0值。
你的代码实际计算结果
字符'9'在ASCII编码下对应的整数值为57,和y的10相加后实际结果为67,你用%d格式说明符即可正确打印该结果。
修正方案
如果需要按浮点数格式输出,手动将计算结果强转为浮点类型:
int y = 10; char z = '9'; printf("%f", (double)(z + y));
如果只需要输出整数值,换用匹配的格式说明符即可:
printf("%d", z + y);
内容的提问来源于stack exchange,提问作者Merve Çiftci
相关产品推荐
相关产品推荐

