【问题标题】:Printing Int as float,double,long double and vice versa将 Int 打印为 float、double、long double ,反之亦然
【发布时间】:2014-05-11 07:59:57
【问题描述】:

试图使代码具有联合结构。我将把整数和 printf 扫描为 int float,double,long double。然后将浮点打印扫描为 int,float,double,long double。对于 double 和 long int 的过程相同.

  1. 这段代码应该可以正常工作吗?将 int 打印为 float 时会给出奇怪的数字。我不确定结果!

代码如下:

union Data
{
   int num_i;
   float num_f;
   double num_d;
   long double num_ld;
};


int main()
{
    union Data data;



   printf("Int girin");
   scanf("%d",&data.num_i);
   printf("Int %d\n",data.num_i);
   printf("Float %f\n",data.num_i);
   printf("Double %Lf\n",data.num_i);
   printf("Long DOuble %Ld\n",data.num_i);


   printf("Float gir");
   scanf("%f",&data.num_f);

   printf("Int %d\n",data.num_f);
   printf("Float %f\n",data.num_f);
   printf("Double %Lf\n",data.num_f);
   printf("Long DOuble %Ld\n",data.num_f);

   printf("Double Gİr");
   scanf("%lf",&data.num_d);

   printf("Int %d\n",data.num_d);
   printf("Float %f\n",data.num_d);
   printf("Double %lf\n",data.num_d);
   printf("Long DOuble %ld\n",data.num_d);

   printf("Long gir ");
   scanf("%ld",&data.num_ld);

   printf("Int %d\n",data.num_ld);
   printf("Float %f\n",data.num_ld);
   printf("Double %lf\n",data.num_ld);
   printf("Long DOuble %ld\n",data.num_ld);



   getch();
}

【问题讨论】:

  • 问题是什么?
  • 你的问题到底是什么?
  • 你的问题是什么?
  • 为什么没有人问这里的问题是什么?
  • 忘记问了。我编辑。

标签: c floating-point int


【解决方案1】:

此代码调用未定义的行为。对数据类型使用错误的转换规范会调用未定义的行为。

7.21.6 格式化输入/输出函数:

如果转换规范无效,则行为未定义。282) 如果任何参数是 不是相应转换规范的正确类型,行为是 未定义。

在 UB 的情况下,所有赌注都被取消。

【讨论】:

【解决方案2】:

好的,要将数字打印为另一种类型的数字,您应该首先对其进行类型转换或类似的东西。例如;

int a = 10;
double b = 5.5;

如果我想分别以doubleint 的形式打印它们,那么我应该执行以下操作:

// %f looks for a double
printf( "%f\n", (double) a );
printf( "%d\n", (int) b );

// output would be:
// 10.000000
// 5

关于您的union,我不确定您期望在那里拥有什么,但您一遍又一遍地覆盖相同的内存位置,每个scanf 调用。 unions 内的元素共享同一个内存位置,该内存位置大到足以容纳其中最大的元素。

所以,要小心。如果你想在最后拥有所有 4 个,你应该考虑使用 struct 而不是 union

【讨论】:

  • 这样对吗?我改了 printf("Float %f\n",(float)data.num_i); 这样的代码printf("双 %Lf\n",(double)data.num_i); printf("Long Double %Ld\n",(long double)data.num_i);
  • 正如我所说,"%f" 实际上是用于double 类型,实际上没有float 的类型说明符,您只需将"%f" 用于double 和@ 987654335@。 "%Ld"long double 是正确的。除此之外,一切都很好。
【解决方案3】:

我认为您想演示使用联合来打印不同类型而不进行强制转换

printf("Int girin");
scanf("%d",&data.num_i);
printf("Int %d\n",data.num_i);
printf("Float %f\n",data.num_f);
printf("Double %Lf\n",data.num_d);
printf("Long DOuble %Ld\n",data.num_ld);

【讨论】:

  • 是的,但我希望联合中的每个变量都应打印为整数、浮点数、双精度数和长双精度数。
  • 访问此联合中不是您设置的最后一个成员的任何成员都是未定义的行为(无论您是否打印它)。原始代码没有这样做。
【解决方案4】:

1) 将字段与scanf()printf() 的正确格式说明符匹配。这也意味着并非所有警告都已启用。启用它们。

2) 零填充data 作为联合字段的scanf() 可能不会完全设置联合中的所有位。

3) 添加了十六进制转储。

#include <stdio.h>
#include <stdlib.h>
#include <float.h>
#include <math.h>
#include <memory.h>

union Data {
  int num_i;
  float num_f;
  double num_d;
  long double num_ld;
};

void uprintf(const union Data *data) {
  printf("Int         %d\n", data->num_i);
  printf("Float       %f\n", data->num_f);
  printf("Double      %lf\n", data->num_d);
  printf("Long Double %Lf\n", data->num_ld);  // was  %Ld and %ld
  unsigned char *x = (void *) data;
  printf("hex     ");
  for (size_t i = 0; i < sizeof(*data); i++)
    printf(" %02X", *x++);
  printf("\n");
}

int main() {
  union Data data;

  memset(&data, 0, sizeof(data));
  printf("Int girin");
  scanf("%d", &data.num_i);
  uprintf(&data);

  memset(&data, 0, sizeof(data));
  printf("Float gir");
  scanf("%f", &data.num_f);
  uprintf(&data);

  memset(&data, 0, sizeof(data));
  printf("Double Gİr");
  scanf("%lf", &data.num_d);
  uprintf(&data);

  memset(&data, 0, sizeof(data));
  printf("Long gir ");
  scanf("%Lf", &data.num_ld);  // was "%ld"
  uprintf(&data);

  //getch();
  return 0;
}

【讨论】:

    猜你喜欢
    • 2013-09-25
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多