将Int打印为float,double,long double,反之亦然

时间:2014-03-31 19:43:17

标签: c floating-point int

尝试使代码具有联合结构。我将整数和printf扫描为int float,double,long double。然后将float print打印为int,float,double,long double。对double和long int执行相同的过程

  1. 此代码是否应该正常运行?当将int打印为float时,它会给出奇怪的数字。我不确定结果!
  2. 以下代码:

    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();
    }
    

4 个答案:

答案 0 :(得分:2)

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

7.21.6格式化输入/输出功能:

  

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

如果是UB,所有投注均已关闭。

答案 1 :(得分:1)

我认为您希望演示使用联合打印不同类型而不进行投射

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);

答案 2 :(得分:0)

好的,要打印一个数字作为另一种类型的数字,你应该首先对其进行类型转换或沿着那些行进行类比转换。例如;

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呼叫。 union内的元素共享相同的内存位置,内存位置足以容纳最大元素。

所以,要小心。如果您想在结尾处拥有全部4个,则应考虑使用struct代替union

答案 3 :(得分:0)

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;
}