题
我有这位代码输出错误的结果。
#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.
float
是永诺转化为double
当传递过来...
的printf,所以你就不能获得4个字节上大多数的英特尔的架构。- 当你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(双):)
不隶属于 StackOverflow