Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取浮点型变量在C中的整数表示值_C_Floating Point - Fatal编程技术网

获取浮点型变量在C中的整数表示值

获取浮点型变量在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);

我将数字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);
    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
的解释与指针逻辑不同。虽然从技术上讲是正确的,但你提出的anser
float a=7.4;int b=a不是这个问题的答案。好好工作,我正在添加nv=((int)&f)以确保完整性,我会将您的答案标记为正确。@lalamer“添加
nv=((int)&f)
以确保完整性”->什么?这不是好的编码。