Redian新闻
>
ANSI C下如何转换十进制小数为十六进制小数
avatar
ANSI C下如何转换十进制小数为十六进制小数# Computation - 科学计算
b*n
1
是unix下的ansi c
我现在有一个double float
code=0.9723847328146829146782164783216478326473826147382614873216483721648732
我需要把这个变量code的二进制形式或者八进制或者十六进制输出
我想问得是是要用printf函数吗?还是别的函数?
如果是用printf,使我下面的这个式子吗?
printf("\nThe code in Hex is %#ox\n\n",code);
关键是那个小数很长
我需要他的全部长度
不仅仅他的开头的部分
谢谢了
avatar
h*o
2
首先我怀疑即使long double也存不了这么多有效数字
实现还是有办法的
main()
{
long double code = 0.972384732814682914678216478321647832647382614738...;
int *p, i;
p = (int *) &code;
for (i = 0; i < sizeof(long double)/sizeof(int); i++)
printf("%08x", p[i]);
puts("");
}
再考虑到little_endian和big_endian的情况,这个问题还蛮复杂的。

【在 b*********n 的大作中提到】
: 是unix下的ansi c
: 我现在有一个double float
: code=0.9723847328146829146782164783216478326473826147382614873216483721648732
: 我需要把这个变量code的二进制形式或者八进制或者十六进制输出
: 我想问得是是要用printf函数吗?还是别的函数?
: 如果是用printf,使我下面的这个式子吗?
: printf("\nThe code in Hex is %#ox\n\n",code);
: 关键是那个小数很长
: 我需要他的全部长度
: 不仅仅他的开头的部分

avatar
h*o
3
btw, 我的结果是
919a5800f8ee34b200003ffe
long double是12个bytes

【在 h***o 的大作中提到】
: 首先我怀疑即使long double也存不了这么多有效数字
: 实现还是有办法的
: main()
: {
: long double code = 0.972384732814682914678216478321647832647382614738...;
: int *p, i;
: p = (int *) &code;
: for (i = 0; i < sizeof(long double)/sizeof(int); i++)
: printf("%08x", p[i]);
: puts("");

avatar
b*n
4
非常感谢
我是使我的程序去
谢谢

0.972384732814682914678216478321647832647382614738...;
code=0.9723847328146829146782164783216478326473826147382614873216483721648732

【在 h***o 的大作中提到】
: btw, 我的结果是
: 919a5800f8ee34b200003ffe
: long double是12个bytes

avatar
b*n
5
关于你写的代码,有2个问题
那个for循环,为什么终止条件是i < sizeof(long double)/sizeof(int)
而不是i < sizeof(long double)
另外我觉得应该那个for循环写成while(p[i]!='\0')
不知道我的想法对不对
哈哈
谢谢
可能是一个newbie的问题了
谢谢

0.972384732814682914678216478321647832647382614738...;
code=0.9723847328146829146782164783216478326473826147382614873216483721648732

【在 h***o 的大作中提到】
: 首先我怀疑即使long double也存不了这么多有效数字
: 实现还是有办法的
: main()
: {
: long double code = 0.972384732814682914678216478321647832647382614738...;
: int *p, i;
: p = (int *) &code;
: for (i = 0; i < sizeof(long double)/sizeof(int); i++)
: printf("%08x", p[i]);
: puts("");

avatar
b*n
6
第二个问题就是little_endian和big_endian是什么意思呀?
在网上查了一下
好像是上下边界的意思
对吗?

0.972384732814682914678216478321647832647382614738...;
code=0.9723847328146829146782164783216478326473826147382614873216483721648732

【在 h***o 的大作中提到】
: 首先我怀疑即使long double也存不了这么多有效数字
: 实现还是有办法的
: main()
: {
: long double code = 0.972384732814682914678216478321647832647382614738...;
: int *p, i;
: p = (int *) &code;
: for (i = 0; i < sizeof(long double)/sizeof(int); i++)
: printf("%08x", p[i]);
: puts("");

avatar
h*o
7
p[i]到p[i+1]相差sizeof(int)个字节

【在 b*********n 的大作中提到】
: 关于你写的代码,有2个问题
: 那个for循环,为什么终止条件是i < sizeof(long double)/sizeof(int)
: 而不是i < sizeof(long double)
: 另外我觉得应该那个for循环写成while(p[i]!='\0')
: 不知道我的想法对不对
: 哈哈
: 谢谢
: 可能是一个newbie的问题了
: 谢谢
:

avatar
h*o
8
search endian吧。
就是不同机器上有不同的字节存储顺序
比如你要表达 ABCD这个数,sun的机器上它的存储顺序就是ABCD
最大的部分在最前面,所以叫big endian
intel x86机器上就不这样了,ABCD在机器里存成CDAB, 小的部分
在最前面,所以叫little endian
http://www.webopedia.com/TERM/B/big_endian.html

【在 b*********n 的大作中提到】
: 第二个问题就是little_endian和big_endian是什么意思呀?
: 在网上查了一下
: 好像是上下边界的意思
: 对吗?
:
: 0.972384732814682914678216478321647832647382614738...;
: code=0.9723847328146829146782164783216478326473826147382614873216483721648732

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。