Floating point 1在C/C+中是如何编码的+;作为浮点(假设IEEE 754单精度表示)?

Floating point 1在C/C+中是如何编码的+;作为浮点(假设IEEE 754单精度表示)?,floating-point,ieee-754,Floating Point,Ieee 754,我的印象是C float有8位指数和23位尾数 所以一个是00111111000000=0x3F800000 但是,以下代码生成的是1.06535e+09,而不是1。 有人能帮我理解为什么吗 #include <iostream> #include <math.h> using namespace std; int main() { float i = 0x3F800000; cout<<i << endl; ret

我的印象是C float有8位指数和23位尾数

所以一个是00111111000000=0x3F800000

但是,以下代码生成的是1.06535e+09,而不是1。 有人能帮我理解为什么吗

#include <iostream>
#include <math.h>  

using namespace std;

int main()
{
    float i = 0x3F800000;
    cout<<i << endl;
    return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
浮点数i=0x3F800000;
库特
1在C中是如何编码为浮点数的

谁能帮我理解为什么(代码失败)

i=1065353216
相同


在C语言中,要覆盖位模式,请使用
联合
memcpy()

在C++中,建议<代码> MycPyIE()< <代码> > < /P> 使用强制转换有可能由于抗锯齿而失败

#包括
#包括
_静态断言(sizeof(float)=sizeof(uint32_t),“意外类型”);
内部主(空){
联合{
uint32_t u;
浮动f;
}x={.u=0x3f800000};
浮动f=x.f;
printf(“%e\n”,f);
返回0;
}
在不太常见的系统上,这可能由于以下原因而失败:

  • float
    不可用

  • float/uint32


使用IEEE-754,浮点数1写为:

0 01111111 00000000000000000000000 (base-2) = 3f80 0000 (base-16)
因此,您的假设是正确的。不幸的是,
0x3f800000
表示的位模式不能通过以下操作分配给浮点:

float a = 0x3f800000
十六进制数将首先转换为一个无符号整数,该整数的值为10进制的
1065353216
。然后该数字将隐式转换为最接近的浮点数


因此,简而言之,虽然IEEE-754浮点数的位模式是正确的,但您对如何分配此模式的假设是不正确的。请看看如何实现这一点,或者看看这个问题的其他答案。

我很确定您没有将该位模式分配给
I
,而是分配给特定的整数。我正在尝试你知道为什么你认为
00111111000000
0x3F800000
应该等于1。你能解释一下这背后的思维过程吗?这不是标准的IEEE表示法吗?看这里虽然我多年没有用过C,但我一直认为
float
double的具体表示法取决于目标体系结构,而不是C标准。我的印象不正确吗?@EricJ。看起来是这样。它将十六进制转换为无符号整数,将无符号整数转换为浮点。如何直接将十六进制分配给浮点?
0 01111111 00000000000000000000000 (base-2) = 3f80 0000 (base-16)
float a = 0x3f800000