我将数字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中工作?
答案 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)通过由union
和float
组成的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
这被称为隐式类型转换,也称为强制,是 由编译器进行的自动类型转换。一些编程 语言允许编译器提供强制;其他人需要它。
但请考虑以下因素: