获取浮点型变量在C中的整数表示值
我将数字20(0x14)存储在32位寄存器中。寄存器分配给一个C浮点变量,该变量表示值2.8e-44。现在我想得到浮点变量的十六进制表示形式,并将其存储到整数变量中,以恢复信息的原始含义。除了做指针生意,还有更好的方法吗?代码如下:获取浮点型变量在C中的整数表示值,c,floating-point,C,Floating Point,我将数字20(0x14)存储在32位寄存器中。寄存器分配给一个C浮点变量,该变量表示值2.8e-44。现在我想得到浮点变量的十六进制表示形式,并将其存储到整数变量中,以恢复信息的原始含义。除了做指针生意,还有更好的方法吗?代码如下: #include <stdio.h> int main() { float f = 2.802597e-44; int nv,*pnv; printf("f=%f\n",f); printf("n=%d\n",f);
#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;
}
#包括
int main()
{
浮子f=2.802597e-44;
国际内华达州*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));
返回0;
}
我使用pnv整数指针得到我想要的。有没有更好的方法来避免指针和在C中工作?如果存在未定义的行为,您没有检查警告吗
warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat=]
printf("n=%d\n",f);
^
请阅读此文:您可以直接将其转换为整数,如下所示:
float a = 7.4;
int b = a; // this will be rounded to 7 and you will lose information
或者您可以使用一些内置的int函数,如round、ceil、floor等
参考:请注意,
(int*)&f
的行为未定义,因为指针类型不相关。所以不要用那种方式来处理问题
检查sizeof(float)
是否与sizeof(int)
相同后,可以通过以下两种方式之一执行此操作:
1) 通过一个由一个float
和一个int
组成的union
键入修剪。使用一个成员设置联合
,并将其与另一个成员一起读回
2) memcpy
将一种类型变量的内容移动到另一种类型变量的位置
我更喜欢(2):(1)可能是用旧的C标准定义的,(2)也用C++做得很好。
< P> C被认为是一种弱类型的语言,它可以允许分配属于不同类型的值,而不是分配给它们的变量,因此你可以简单地这样做: int integer = 1;
float floater =1.1111;
floater = integer;
这称为隐式类型转换,也称为强制,是
由编译器进行的自动类型转换。一些编程
语言允许编译器提供强制;其他人需要它
但请考虑以下内容:
- 当浮动小于零时会发生什么
#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;
}
#包括
int main()
{
并集{int i;浮点f;}fi;
fi.f=2.802597e-44;
printf(“f=%e\n”,fi.f);
printf(“n=%d\n”,fi.i);
返回0;
}
您可以使用类型转换
float x =3.4;
int y = (int)x;
浮点型寄存器
那是什么?printf(“n=%d\n”,f)代码>是UB。浮点型变量中的值在哪里?我只能在f
中看到一个接近0的数字。您(我)想将浮点值
转换为整数(即,在转换允许的范围内保留数值),还是想将与浮点值
相关联的内存视为整数?@Jens 2.8e-44的十六进制表示为0x14。选中[link]并检查十六进制表示,然后将0x14转换为十进制。@lalamer nice,请查看我的更新答案,谢谢你的投票,你也从我这里得到了它。什么是Serial.println()
?@mouviciel,它特定于我的C IDE使用的串行窗口,它只在类似控制台的窗口上打印值!memcpy实际上和指针一样。为了完整起见,您能为联合技巧提供一个代码示例吗。你可以修改我的代码。不,memcpy
不是一回事memcpy
由标准定义,您更改指针类型的方式不由标准定义。由哪个标准定义?提供参考资料。@M.M谢谢你的参考资料。我正在阅读ISO9899:1999,因为我使用的是C99兼容的编译器。6.5.7被命名为“按位移位运算符”,没有提及memcpy。你的意思是别的吗?@Bathsheba:虽然标准定义了memcpy
,但从float
复制到int
的解释与指针逻辑不同。虽然从技术上讲是正确的,但你提出的anserfloat a=7.4;int b=a代码>不是这个问题的答案。好好工作,我正在添加nv=((int)&f)以确保完整性,我会将您的答案标记为正确。@lalamer“添加nv=((int)&f)
以确保完整性”->什么?这不是好的编码。