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未定义的行为不必是“随机”或“每次都不同”。在这种情况下,未定义的行为是相当一致的。未定义的行为甚至可能正是您所期望的;但是当您升级编译器时,它也可能会改变。