gpt4 book ai didi

c - 如何在 printf 中处理 float/double 到 int 的转换?

转载 作者:太空狗 更新时间:2023-10-29 16:45:45 26 4
gpt4 key购买 nike

考虑这个程序

int main()
{
float f = 11.22;
double d = 44.55;
int i,j;

i = f; //cast float to int
j = d; //cast double to int

printf("i = %d, j = %d, f = %d, d = %d", i,j,f,d);
//This prints the following:
// i = 11, j = 44, f = -536870912, d = 1076261027

return 0;
}

有人可以解释为什么从 double/float 到 int 的转换在第一种情况下可以正常工作,而在 printf 中完成后却不起作用吗?
该程序是在 32 位 linux 机器上的 gcc-4.1.2 上编译的。


编辑: Zach's answer似乎合乎逻辑,即使用格式说明符来确定要从堆栈中弹出的内容。但是,请考虑以下后续问题:

int main()
{

char c = 'd'; // sizeof c is 1, however sizeof character literal
// 'd' is equal to sizeof(int) in ANSI C

printf("lit = %c, lit = %d , c = %c, c = %d", 'd', 'd', c, c);
//this prints: lit = d, lit = 100 , c = d, c = 100
//how does printf here pop off the right number of bytes even when
//the size represented by format specifiers doesn't actually match
//the size of the passed arguments(char(1 byte) & char_literal(4 bytes))

return 0;
}

这是如何工作的?

最佳答案

printf函数使用格式说明符来确定要从堆栈中弹出的内容。所以当它看到 %d , 它弹出 4 个字节并将它们解释为 int ,这是错误的((float)3.0 的二进制表示与 (int)3 不同)。

您需要使用 %f格式说明符或将参数转换为 int .如果您使用足够新的版本 gcc ,然后打开更强的警告会捕获此类错误:

$ gcc -Wall -Werror test.c
cc1: warnings being treated as errors
test.c: In function ‘main’:
test.c:10: error: implicit declaration of function ‘printf’
test.c:10: error: incompatible implicit declaration of built-in function ‘printf’
test.c:10: error: format ‘%d’ expects type ‘int’, but argument 4 has type ‘double’
test.c:10: error: format ‘%d’ expects type ‘int’, but argument 5 has type ‘double’

对问题编辑部分的回复:

C 的整数提升规则规定所有小于 int 的类型晋升为int当作为可变参数传递时。所以在你的情况下,'d'正在晋升为 int , 然后 printf 弹出一个 int并转换到 char .我能找到的关于此行为的最佳引用是 this blog entry .

关于c - 如何在 printf 中处理 float/double 到 int 的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2398791/

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