C++ 打印浮点数为 nan

ACa*_*ter 0 c++ floating-point nan

这是一个简化的 C++ 程序,将 4 个字节转换为它们的 IEE754 浮点表示。

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

uint8_t bytes[4] = {0x40, 0xd5, 0xc6, 0x7f}; // 0x40d5c67f
float f;

int main()
{
    memcpy(&f, &bytes[0], 4);
    printf("%.*lf", 5, f);
}
Run Code Online (Sandbox Code Playgroud)

它的输出是nanisnan也为它返回true。这是怎么发生的?0x40d5c67f 是 6.6804...

在我的类似 arduino 的微控制器和http://cpp.sh/ 上都会发生

Mik*_*CAT 5

如果您在使用little-endian的机器上运行此代码,则多字节数字的较高位将存储在内存的较高地址中。

因此,在小端机器上,内存上的 4 字节数字 0x40, 0xd5, 0xc6, 0x7f被视为0x7fc6d540,而不是0x40d5c67f

解释为IEEE754,这个数的指数部分是255,这个数的小数部分不是0,所以这是NaN。