printf期望短整数类型却传入int时是否属于未定义行为?
关于printf格式符与参数类型不匹配的行为分析
先直接给结论:这两种情况都不属于未定义行为,但要注意前提是传入的整数值能被目标类型(short或signed char)正确表示。下面具体拆解:
1. 关于printf("%hi", 6);的情况
首先得回忆可变参数函数的默认参数提升规则:在调用像printf这种可变参数函数时,所有char、short类型的实参都会被提升为int;float会被提升为double。这里的6本身是int类型(整数字面量默认是int),就算你传的是一个short变量,它也会先被提升成int再传给printf。
而%hi格式符的作用是告诉printf:把传入的整数转换成short类型后输出。因为6的值完全在short的取值范围内(假设short是2字节,范围是-32768到32767),这个转换是符合C标准规定的,结果是确定的——输出6,没有任何未定义行为。
2. 关于%hhi的情况
%hhi对应的是signed char类型(无符号字符用%hhu)。同样遵循默认参数提升规则,6作为int传入后,printf会把它转换成signed char类型再输出。只要6在signed char的取值范围内(通常是-128到127),这个转换就是安全且定义明确的,同样不会触发未定义行为。
什么时候会触发未定义行为?
如果传入的整数值超出了目标类型的取值范围,情况就不一样了。比如:
printf("%hi", 0x8000); // 0x8000是32768,超过了2字节short的最大值32767
这时候,把一个超出short范围的int值强制转换为short,属于有符号整数溢出,而C标准明确规定这种溢出是未定义行为,所以整个printf调用的行为也就变成未定义的了。
内容的提问来源于stack exchange,提问作者alx - recommends codidact
相关产品推荐
相关产品推荐

