四个字节的char数组怎么转换为浮点数

cqqjj3887 2013-05-22 02:35:54
如题,有char aa[4]={0x3e,0xc0,0x62,0x11}
怎么将其转换为浮点数
麻烦大虾指点,确实不明白怎么弄
...全文
2444 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
chijianing 2013-11-08
  • 打赏
  • 举报
回复
引用 6 楼 mougaidong 的回复:
union { char bytes[4]; float f; };
联合体我也试过,有意思的是,一会 float f正确,一会又不对。而里面的bytes又已经赋值了。 另外用union转整形的时候,也是这个问题。 union需要什么特殊处理么?
chijianing 2013-11-08
  • 打赏
  • 举报
回复
楼主,在c环境下怎末转啊?? 没有std::cout << (*c)<< std::endl。
cqqjj3887 2013-05-23
  • 打赏
  • 举报
回复
引用 18 楼 xujiezhige 的回复:
要分清数值的高位、低位与地址从低到高的不同。Apple处理器应该是大端序的。就正好反过来了。
引用 18 楼 xujiezhige 的回复:
要分清数值的高位、低位与地址从低到高的不同。Apple处理器应该是大端序的。就正好反过来了。
果然是这样的,反过来就对了,问题已解决,现在结贴,多谢各位的耐心解答。
cqqjj3887 2013-05-23
  • 打赏
  • 举报
回复
引用 17 楼 xujiezhige 的回复:
Interl和AMD的cpu应该是小端序的,即低位字节放在低地址。例如:int a = 1;在内存中从低地址到高地址分别是:0x01,0x00, 0x00, 0x00。 所以你的char bb[4]={0x0,0x0,0xb3,0xe2};对应的整形数值,从高位到低位分别时:0xe2,0xb3,0x00, 0x00.所以这个整数的值是:0xe2b30000。
你的意思就是说需要把高低位反向计算吗?
雪人2015 2013-05-23
  • 打赏
  • 举报
回复
要分清数值的高位、低位与地址从低到高的不同。Apple处理器应该是大端序的。就正好反过来了。
雪人2015 2013-05-23
  • 打赏
  • 举报
回复
Interl和AMD的cpu应该是小端序的,即低位字节放在低地址。例如:int a = 1;在内存中从低地址到高地址分别是:0x01,0x00, 0x00, 0x00。 所以你的char bb[4]={0x0,0x0,0xb3,0xe2};对应的整形数值,从高位到低位分别时:0xe2,0xb3,0x00, 0x00.所以这个整数的值是:0xe2b30000。
cqqjj3887 2013-05-23
  • 打赏
  • 举报
回复
楼上的aa是bb,弄错了不好意思,请各位大虾帮忙指导下是哪个地方出错了呢?
cqqjj3887 2013-05-23
  • 打赏
  • 举报
回复
引用 10 楼 xujiezhige 的回复:
为什么我用上面人的回答就可以呢?
#include "stdafx.h"
#include <iostream>


int _tmain(int argc, _TCHAR* argv[])
{
    char aa[4]={0x3e,0xc0,0x62,0x11};

    float* pf = ( float*)aa;

    std::cout << ( *pf ) << std::endl;
    std::cin.get();
	return 0;
}
输出:1.78875e-028
多谢你们的解答,再请教个问题,想把字符数组转换为整数,用强制转换怎么不对呢 我的程序如下 char bb[4]={0x0,0x0,0xb3,0xe2}; int* c=(int*)aa; std::cout << (*c)<< std::endl; 实际值该是46050,我的比这个数值大很多
赵4老师 2013-05-23
  • 打赏
  • 举报
回复
char bb[4]={0x0,0x0,0xb3,0xe2};
char aa[4];
aa[0]=bb[3];
aa[1]=bb[2];
aa[2]=bb[1];
aa[3]=bb[0];
int* c=(int*)aa;
std::cout << (*c)<< std::endl;
失散糖 2013-05-23
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
赵4老师 2013-05-22
  • 打赏
  • 举报
回复
#pragma warning(disable:4305)
#include <stdio.h>
int main() {
	char aa[4]={0x3e,0xc0,0x62,0x11};
	char bb[4]={0x11,0x62,0xc0,0x3e};
    printf("%g,%g\n",((float *)aa)[0],((float *)bb)[0]);
    return 0;
}
//1.78875e-028,0.375748

图灵狗 2013-05-22
  • 打赏
  • 举报
回复
试试我在3楼的回复,要用float,不能用double的。
引用 8 楼 cqqjj3887 的回复:
[quote=引用 5 楼 ronghuahh 的回复:] [quote=引用 4 楼 ronghuahh 的回复:]
char aa[4]={0x3e,0xc0,0x62,0x11};
	double daa = 0;
	memcpy(&daa, aa, sizeof(aa));
这样对么
应该是float[/quote] 请问有没有能实现的方法,楼上各位提供的都不能用[/quote]
zybjtu 2013-05-22
  • 打赏
  • 举报
回复
这种进入位模式思考的题,得看你转化为什么样的浮点数了。
zafu_acm 2013-05-22
  • 打赏
  • 举报
回复
int main() { char a[4] = {"123"}; double aa; sscanf(a, "%lf", &aa); cout<<aa; getchar(); }
雪人2015 2013-05-22
  • 打赏
  • 举报
回复
为什么我用上面人的回答就可以呢?
#include "stdafx.h"
#include <iostream>


int _tmain(int argc, _TCHAR* argv[])
{
    char aa[4]={0x3e,0xc0,0x62,0x11};

    float* pf = ( float*)aa;

    std::cout << ( *pf ) << std::endl;
    std::cin.get();
	return 0;
}
输出:1.78875e-028
zafu_acm 2013-05-22
  • 打赏
  • 举报
回复
double a; sscanf(a, "%lf", aa); //如果数大了精度会丢失
cqqjj3887 2013-05-22
  • 打赏
  • 举报
回复
引用 5 楼 ronghuahh 的回复:
[quote=引用 4 楼 ronghuahh 的回复:]
char aa[4]={0x3e,0xc0,0x62,0x11};
	double daa = 0;
	memcpy(&daa, aa, sizeof(aa));
这样对么
应该是float[/quote] 请问有没有能实现的方法,楼上各位提供的都不能用
cqqjj3887 2013-05-22
  • 打赏
  • 举报
回复
楼上的各位大虾,你们的方法都试过,最后的结果都是0.0000,不能用啊,急求,请各位大虾给个能用的的方法
turing-complete 2013-05-22
  • 打赏
  • 举报
回复
union { char bytes[4]; float f; };
Shana2013 2013-05-22
  • 打赏
  • 举报
回复
引用 4 楼 ronghuahh 的回复:
char aa[4]={0x3e,0xc0,0x62,0x11};
	double daa = 0;
	memcpy(&daa, aa, sizeof(aa));
这样对么
应该是float
加载更多回复(4)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧