在C中获取float类型变量的整数表示值

时间:2016-03-21 07:54:29

标签: c floating-point

我将数字20(0x14)存储在32位寄存器中。寄存器分配给表示值2.8e-44的C float变量。现在我想得到float变量的十六进制表示并将其存储到整数变量中,以恢复信息的原始含义。除了做一些指针业务之外,还有更好的方法吗?这是代码:

#include <stdio.h>

int main()
{
    float f = 2.802597e-44;
    int nv,*pnv;
    printf("f=%f\n",f);
    printf("n=%d\n",f);
    nv=(int)f;
    printf("n=%d\n",nv);
    pnv=(int*)&f;
    printf("n=%d\n",(*pnv));
    return 0;
}

我使用pnv整数指针得到了我想要的东西。有没有更好的方法来避免指针和在C中工作?

6 个答案:

答案 0 :(得分:4)

您可以通过工会实现您的需求:

#include <stdio.h>

int main()
{
  union { int i; float f; } fi;
  fi.f = 2.802597e-44;
  printf("f=%e\n",fi.f);
  printf("n=%d\n",fi.i);
  return 0;
}

答案 1 :(得分:2)

请注意(int*)&f的行为是 undefined ,因为指针类型不相关。所以不要以这种方式处理问题。

检查sizeof(float)sizeof(int)相同后,您可以通过以下两种方式之一完成此操作:

1)通过由unionfloat组成的int进行修剪。使用一个成员设置union,然后用另一个成员读回。

2)memcpy一种类型的变量的内容到另一种类型的变量的位置。

其中我更喜欢(2):( 1)可能未使用较旧的C标准进行定义,(2)也适用于C ++。

答案 2 :(得分:1)

您可以直接将其转换为整数;

float a = 7.4;
int b = a; // this will be rounded to 7 and you will lose information

或者你可以使用一些内置的int函数,如round,ceil,floor等。

供参考:http://www.cplusplus.com/reference/cmath/round/?kw=round

答案 3 :(得分:1)

你可以使用类型转换..

float x =3.4;
int y = (int)x;

答案 4 :(得分:0)

你在做什么未定义的行为,你没有检查警告吗?

warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat=]
     printf("n=%d\n",f);
     ^

请阅读此内容:How do the digits 1101004800 correspond with the number 20?

答案 5 :(得分:-1)

C被认为是弱类型语言,它可以允许分配属于不同类型的值而不是它们被赋予的变量,因此您可以简单地执行此操作:

sr_no
  

这被称为隐式类型转换,也称为强制,是   由编译器进行的自动类型转换。一些编程   语言允许编译器提供强制;其他人需要它。

但请考虑以下因素:

  • 当浮点数小于零时会发生什么?