printf函数int到%f,float到%d尝试进行实验

#include<stdio.h>
int main(){
    int i=10;
    float x=43.2892f;
    printf("i=%f  x=%d \n",i,x);
    return 0;
}

输出:
i=43.289200  x=10

需要帮助来理解为什么这些变量是交换的?

最佳答案

您所做的调用了未定义的behavior1,但是在带有the resulting assembly的平台上使用GCC,我们可能会提出一个假设。浮点值在xmm0寄存器(SSE寄存器)中传递,而整数在esi寄存器(常规寄存器)中传递。想必,您的printf实现期望浮点数在SSE寄存器中传递,而整数在一般寄存器中传递,并且当遇到第一个xmm0寄存器时,只需选择要从中读取的%f寄存器(反之亦然)。
1未定义的行为不必是“随机”或“每次都不同”。在这种情况下,未定义的行为是相当一致的。未定义的行为甚至可能正是您所期望的;但是当您升级编译器时,它也可能会改变。

10-04 14:14