错误转换规范下的GCC奇怪行为

错误转换规范下的GCC奇怪行为,c,gcc,C,Gcc,这是一个检查GCC处理转换规范行为的简单代码。 (我知道警告等,但我只是玩转换) 有人能解释这种行为吗?在对printf的第二次调用中,传入的值的类型与格式说明符指定的类型不匹配。这样做会激发我们的兴趣 在这种情况下可能发生的情况是,ABI通过浮点寄存器传递堆栈上的整数值和浮点值,因此这些值恰好位于正确的位置,以正常的方式打印。但同样,因为这是未定义的行为,所以您不能依赖它。不是堆栈,而是通用寄存器。同样的问题(错误格式的printf)再次出现。如果给汽油车加注柴油,您认为会发生什么。1.将正常

这是一个检查GCC处理转换规范行为的简单代码。 (我知道警告等,但我只是玩转换)


有人能解释这种行为吗?

在对
printf
的第二次调用中,传入的值的类型与格式说明符指定的类型不匹配。这样做会激发我们的兴趣


在这种情况下可能发生的情况是,ABI通过浮点寄存器传递堆栈上的整数值和浮点值,因此这些值恰好位于正确的位置,以正常的方式打印。但同样,因为这是未定义的行为,所以您不能依赖它。

不是堆栈,而是通用寄存器。同样的问题(错误格式的printf)再次出现。如果给汽油车加注柴油,您认为会发生什么。1.将正常驾驶2。我不会开3路车。我会崩溃的。这里也是。你有%d(汽油)和柴油(浮子),反之亦然。很好的类比。虽然这不是我问题的核心,但printf expets(在这个ABI中)是sse或数学协处理器寄存器中的浮点值,是通用uP寄存器中的整数。那么,在功能中打印订单时并不重要。让我们看看失望和成功!!!是的,因为你放错了油。这是一个UB。
#include <stdio.h>

int main(){
  int i = 15;
  float x = 5.53f;
  printf("i = %d, x = %f\n", i, x);
  
  printf("i = %f, x = %d\n", i, x);
  return 0;

}
i = 15, x = 5.530000
i = 5.530000, x = 15