memcpy没有按照预期的那样做

Tan*_*anj 1 c c++ memcpy

我有一些输出错误结果的代码.

#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我将属于编译器优化)

这在以前在另一台计算机上工作.这可能是一次架构改变.

Art*_*yom 8

这不是memcpy的问题.

  1. floatdouble在传递...printf 时总是被转换为,所以你在大多数英特尔架构上都无法获得4个字节.
  2. 当您0xdeadbeef在此代码中表达时,您假设您的体系结构是BIG端.有许多小端架构,例如Intel x86.


小智 6

你会意识到当传递给像printf()这样的变量参数函数时,浮点数会被提升为double吗?所以当你说:

printf("bytes 0x%x float %e\n", flt, flt);
Run Code Online (Sandbox Code Playgroud)

你试图处理真正的两个8字节值,如两个4字节值,给出(我相信)未定义的行为.