我有一些输出错误结果的代码.
#include <stdio.h>
#include <string.h>
int main()
{
unsigned char bytes[4];
float flt=0;
bytes[0]=0xde;
bytes[1]=0xad;
bytes[2]=0xbe;
bytes[3]=0xef;
memcpy( &flt, bytes, 4);
printf("bytes 0x%x float %e\n", flt, flt);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是
bytes 0xc0000000 float -2.000001e + 00
我期待着
bytes 0xdeadbeef float -6.2598534e + 18
编辑#1正如所指出的那样,字节顺序可能会有所不同,这会产生以下结果
bytes 0xefbeadde float -1.1802469e + 29
我不明白的是从float到unsigned int的转换导致0xc0000000(同一printf语句中的float为-2.0000我将属于编译器优化)
这在以前在另一台计算机上工作.这可能是一次架构改变.
这不是memcpy的问题.
floatdouble在传递...printf 时总是被转换为,所以你在大多数英特尔架构上都无法获得4个字节.0xdeadbeef在此代码中表达时,您假设您的体系结构是BIG端.有许多小端架构,例如Intel x86.小智 6
你会意识到当传递给像printf()这样的变量参数函数时,浮点数会被提升为double吗?所以当你说:
printf("bytes 0x%x float %e\n", flt, flt);
Run Code Online (Sandbox Code Playgroud)
你试图处理真正的两个8字节值,如两个4字节值,给出(我相信)未定义的行为.