#include <stdio.h>

int main(void) {
    printf("%d\n", 50.2);
    return 0;
}


〜当我执行它时。

c - C编程printf(“%d”,50.2);-LMLPHP

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/

10-12 18:05