如何将一个double类型的整数(大于32位)按高低位转化为两个long类型

jj807 2011-04-12 05:43:01
有个double类型的整数,比如123456789876.00000,请问如何转化为两个long型的数,按高低位存放在数组
unsiged long a[2]中?
如果是long long 类型可以直接移位,将高低位放入a[2]中,但是double存储方式不同,怎么做呢?
PS:我使用的CPU支持的64位类型只有double,不支持long long。
...全文
404 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
呵-呵呵 2011-04-12
  • 打赏
  • 举报
回复
double num = 123456789876.00000;
void *p = #
unsigned long a = (long *)p;
unsigned long b = (long *)(p + 1);
晨星 2011-04-12
  • 打赏
  • 举报
回复
哦哦哦,还有汇编。。
学习了。
  • 打赏
  • 举报
回复
使用__int64类型,直接赋值就可以转换。
如果你的编译器不支持int64(现在还有这样的编译器?),可以这样转换:
double d=123456789876.0;
long a[2];

__asm{
fld qword ptr d
fistp qword ptr a
}
ssbb94 2011-04-12
  • 打赏
  • 举报
回复
用sprintf转成字符串,再把字符串转数字存到整数里呢?没试验,提个想法
晨星 2011-04-12
  • 打赏
  • 举报
回复
如果你确定范围不超出128位整数的范围,那可以调用_gcvt/_ecvt/_fcvt等函数自己手工实现。
晨星 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jj807 的回复:]
不是这个意思啊,要存出来与long long类型的123456789876高低位放入a[2]中的结果一样啊,但是double类型和long long类型在数据存储上完全不同啊。
[/Quote]
那恐怕不行,定点数和浮点数的设计思路本来就不一样的。
只说正数,double最大可表示10的308次方,最小可表示10的-308次方,而128位无符号整数最小只能表示0,最大也只能接近2的128次方,如何放得下?
jj807 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 steedhorse 的回复:]
你是指直接存二进制?如果是可以这样:

C/C++ code
union A {
double d;
unsigned long ul[2];
};
A a;
a.d = 123456789876.00000;
printf("%lx-%lx\n", a.ul[0], a.ul[1]);
[/Quote]

不是这个意思啊,要存出来与long long类型的123456789876高低位放入a[2]中的结果一样啊,但是double类型和long long类型在数据存储上完全不同啊。
晨星 2011-04-12
  • 打赏
  • 举报
回复
你是指直接存二进制?如果是可以这样:
union A {
double d;
unsigned long ul[2];
};
A a;
a.d = 123456789876.00000;
printf("%lx-%lx\n", a.ul[0], a.ul[1]);

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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