#include <stdio.h>
int main(void) {
printf("%d\n", 50.2);
return 0;
}
〜当我执行它时。
50.2的二进制为(0100 0010 0100 1000 1100 1100 1100 1100 1101)。
因此,我期望有1,112,067,277,但是这些值既不固定也不固定。
每次都更改值,为什么?
最佳答案
问题是您在printf中使用了错误的格式说明符,而%d
而不是%f
。这会调用未定义的行为。
每当您调用未定义的行为时,就不会有任何确定性或预期的输出。当您有未定义的行为时,编译器可以继续进行奇怪的假设,例如“从不使用该float文字,因此无需为其分配内存”。这意味着您可能最终会打印垃圾内存位置,甚至使程序崩溃。因此,分析未定义行为为何能产生特定结果的原因并不是有意义的任务。
为了保证确定性的行为,您必须执行以下操作:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <string.h>
int main(void)
{
const double number = 50.2;
union
{
double d;
uint8_t u8 [sizeof(double)];
} u = { number };
printf("Binary representation of %f:\n", number);
for(size_t i=0; i<sizeof(double); i++)
{
printf("%.2" PRIx8 " ", u.u8[i]);
}
printf("\n\n");
printf("Integer (nonsense) representation of %f:\n", number);
int i;
memcpy(&i, u.u8, sizeof(int));
printf("%d", i);
return 0;
}
输出:
Binary representation of 50.200000:
9a 99 99 99 99 19 49 40
Integer (nonsense) representation of 50.200000:
-1717986918
这是在一台机器上,其中double是8字节,整数是4字节/小尾数,这意味着您将获得4个最低有效字节作为一些废话输出(即数字99999999Ah)。
关于c - C编程printf(“%d”,50.2);,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41443007/