gpt4 book ai didi

c - printf 函数如何处理 %f 规范?

转载 作者:太空宇宙 更新时间:2023-11-04 05:01:39 24 4
gpt4 key购买 nike

我有几个程序的输出我无法理解:

计划一

#include <stdio.h>
int main(void)
{
int i=1;
float k=2;
printf("k is %f \n",k);
printf("i is %f \n",i);
return 0;
}

输出在 http://codepad.org/ZoYsP6dc

k is 2.000000 
i is 2.000000

计划2

再举一个例子

#include <stdio.h>

int main(void)
{
char i='a';
int a=5;
printf("i is %d \n",i); // here %d type cast char value in int
printf("a is %f \n",a); // hete %f dont typecast float value
printf("a is %f \n",(float)a); // if we write (float) with %f then it works
return 0;
}

这里的输出是 http://codepad.org/XkZVRg64

i is 97 
a is 2.168831
a is 5.000000

问题

这是怎么回事?为什么会显示输出?

最佳答案

您可能正在 64 位 x86 架构上运行此应用程序。在此体系结构中,浮点参数在 XMM 寄存器中传递,而整数参数在通用寄存器中传递。参见 System V AMD64 ABI convention .

因为 %f 需要一个浮点值:

printf("i is %f \n",i);

打印 XMM0 寄存器的值,它恰好是之前分配的 k 的值,而不是 RSI 寄存器中传递的 i 的值。组装看起来像这样:

movl    $.LC1, %edi       # "k is %f \n"
movsd .LC0(%rip), %xmm0 # float k = 2
call printf
movl $1, %esi # int i = 1
movl $.LC2, %edi # "i is %f \n"
call printf # prints xmm0 because of %f, not esi

如果您像这样重新排序作业:

int i = 1;
printf("i is %f \n",i);

float k = 2;
printf("k is %f \n",k);

它打印:

i is 0.000000 
k is 2.000000

因为 XMM0 寄存器的值恰好为 0。

[更新]它也可以在 32 位 x86 上重现。在这个平台上,printf() 基本上是将 int* 转换为 double*,然后读取那个 double。让我们修改示例以使其易于查看:

int main() {
float k = 2;
int i = -1;
printf("k is %f \n",k);
printf("i is %f \n",i,i);
}

64 位输出:

k is 2.000000 
i is 2.000000

32 位输出:

k is 2.000000 
i is -nan

也就是说,2 个值为 -1 的 int 看起来像一个 double 0xffffffffffffffff,它是一个 NaN 值。

关于c - printf 函数如何处理 %f 规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8223740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com