我有这位代码输出错误的结果。

#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;
}

输出,我得到的是

字节0xc0000000浮-2.000001e+00

我期望得到的

字节0xdeadbeef浮-6.2598534e+18

编辑#1 正如指出的字节序可能是不同的,这将导致在下面

字节0xefbeadde浮-1.1802469e+29

我不明白是从浮到unsigned int导致0xc0000000(浮在同一printf声明正在-2.0000我会属性来编译器优化)

这个工作之前,在一个不同的计算机。它可能是一个结构变化。

有帮助吗?

解决方案

这不是问题的memcpy.

  1. float 是永诺转化为 double 当传递过来 ... 的printf,所以你就不能获得4个字节上大多数的英特尔的架构。
  2. 当你expacting 0xdeadbeef 在这个码,你假设你的体系结构是BIG endian.有许多小端体系结构,例如英特尔x86。

其他提示

您一定要明白,浮子被提升传递给一个变量参数时的作用如printf加倍()?所以,当你说:

printf("bytes 0x%x float %e\n", flt, flt);

您要治疗什么是真正的两个8字节值就像两个4字节 值,得到(I相信)未定义的行为。

的 “%X” 在printf的期望一个unsigned int。你给它这是越来越自动转换和这不是你想要什么浮动。你想要做的事,如:

printf("bytes 0x%x float %e\n", *((unsigned int *)&flt), flt);

呵呵,和其他人指出的那样,如果你是在x86你不会看到0xdeadbeef,更像0xefbeadde。

请参阅如果这是任何更好:

printf("bytes 0x%x float %e\n", *(int *)&flt, flt);

要看到的参数推广,从浮改变声明翻一番。在我的机器,其打印:

bytes 0xefbeadde float -1.860545e+230

在0xefbeadde是大端为deadbeaf。最后4个字节的双重的是不确定的,所以浮子之后显示的数量将有所不同。

您提到它的工作的另一台计算机,什么样的电脑是吗?一定是小端序其中的sizeof(浮点)==的sizeof(双):)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top