C float 每次执行都会改变 %d 个值

标签 c floating-point computer-science precision

我尝试使用 %d 打印 float (我知道不应该这样做。 但每次重新运行可执行文件时,它都会给出不同的值)
我的问题是:为什么打印的值每次都改变? 我的系统:Ubuntu 14.04(64 位) 编译器:4.8.4 这是代码:

#include<stdio.h>

int main(){
  float b = 12.3456;

  printf("%d\n",b);

}

示例输出:

4bh1@mybox:~/C-fi$ ./test 
-1629995944
4bh1@mybox:~/C-fi$ ./test 
1147348376
4bh1@mybox:~/C-fi$ ./test 
-1746005432
4bh1@mybox:~/C-fi$ ./test 
510102216
4bh1@mybox:~/C-fi$ 

最佳答案

printf 使用错误的格式说明符是 undefined behavior 的经典示例.这意味着行为是不可预测的,并且不能依赖于从一次运行到下一次运行是一致的。它可能会崩溃,它可能会打印随机值,或者它可能看起来正常工作。

实际发生的是相关编译器和架构的实现细节。但是,除非您真的在编写编译器,否则深入研究它没有多大用处。

如果您熟悉汇编程序,您可以查看编译后的代码以了解它生成了哪些指令。但是请记住,不同的编译器(即使是具有不同优化设置的相同编译器)很可能会生成不同的程序集。

关于C float 每次执行都会改变 %d 个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38266112/

相关文章:

c - 指针类型的char数组的反向引用

c - 错误: too many arguments to function

java - 如何将 JavaFx 的按钮更改为与此完全相同?

algorithm - 判断线性时间是否存在众数

c - C 中 realloc() 的问题。总是挂起但编译正常

我可以使用 main 中 argc 的地址作为随机源吗?

java - java中的大 float 和 double 打印/保留不正确。此行为是由于有效位数所致吗?

php - Laravel(或 PHP/MySQL?)在小数点后削减 float

c - 如何使用 float.h 宏来提高浮点精度

operating-system - 关于虚拟内存地址结构的一些查询