求助!将12345.67891023456转换成二进制数输出的问题!

Miqiuha 2016-08-28 06:55:39
//用来计算组合数且不溢出结果 (上边的程序是我的想法)分开计算,小数点之前的和之后的,但是好像错
/*#include<iostream>
#include<vector>
using namespace std;
int main(){
double e=12345.67891023456;
int i=12345;
double weishu=0.67891023456;
int t;
vector<int> aa,bb;
while(i!=0){ //计算整数部分
t=i%2;
aa.push_back(t);//存起来
}
t=1;
double j=0;
while(t<=11){ //计算尾数部分,并手动确认11位的精度
weishu*=2;
j=weishu-1;
if(j>0){
bb.push_back(1);
weishu-=1;
}
else{
bb.push_back(0);
}
}
for(i=aa.size();i>0;i++)//对结果进行输出
cout<<aa[i];
cout<<'.';
for(i=0;i<bb.size();i++)
cout<<bb[i];
return 0;
}*/




//**下面是书上的答案

#include<iostream>
#include<iomanip>
using namespace std;
int main(){
long double d=12345.67891023456;
cout<<fixed<<setprecision(11)<<d<<"\n";
char*p=(char*)&d; //这里为什么要强制类型转换成字符指针型啊?
for(int i=9;i>=0;--i){
//长双精度数高位到低位的排列,随编译器的不同而不同 (书上写的)
char c=p[i];
for(int j=7;j>=0;--j)
cout<<(c>>j&1); //这里的 c>>j 是什么意思啊?不懂
cout<<(i%5==0?"\n":",");
}
return 0;
}
...全文
313 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-08-29
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
int main() {
    int i,v;
    char bs[33];
    char b[33];
    char hs[9];
    char h[9];
    char s[4];
    char *e;

// 十进制整数转二进制串;
    i=1024;
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("i=%d,bs=%s\n",i,bs);
// 十进制整数转十六进制串;
    i=1024;
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("i=%d,hs=%s\n",i,hs);
// 十六进制字符串转成十进制数
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    printf("hs=%s,i=%d\n",hs,i);
// 二进制字符串转化为十六进制字符串;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("bs=%s,hs=%s\n",bs,hs);
// 二进制字符串转化为十进制数;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    printf("bs=%s,i=%d\n",bs,i);
// 十六进制字符串转成二进制串
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("hs=%s,bs=%s\n",hs,bs);
// ASC\GBK字符串转十六进制串
    strcpy(s,"a汉");
    i=0;
    while (1) {
        if (0==s[i]) break;
        sprintf(hs+i*2,"%02X",(unsigned char)s[i]);
        i++;
    }
    setlocale(LC_ALL,"chs");
    printf("s=%s,hs=%s\n",s,hs);
// 十六进制字符串转成汉字(GBK)及字符(ASC)
    strcpy(hs,"61BABA");
    i=0;
    while (1) {
        if (1!=sscanf(hs+i*2,"%2x",&v)) break;
        s[i]=(char)v;
        i++;
    }
    s[i]=0;
    printf("hs=%s,s=%s\n",hs,s);

    return 0;

}
//i=1024,bs=00000000000000000000010000000000
//i=1024,hs=00000400
//hs=00000400,i=1024
//bs=00000000000000000000010000000000,hs=00000400
//bs=00000000000000000000010000000000,i=1024
//hs=00000400,bs=00000000000000000000010000000000
//s=a汉,hs=61BABA
//hs=61BABA,s=a汉
Ouyang_Lianjun 2016-08-28
  • 打赏
  • 举报
回复
首先我来解释一下书本的代码: (1):char * p=(char *) &d; 首先我们要知道系统是按字节编址,每个字节都有一个地址,又由于每个char都是占用一个字节的大小,所以使用char指针来访问d。 (2):“长双精度数高位到低位的排列,随编译器的不同而不同”这句话的意思是指:机器中存储数据的方式,有两种:一种是大端法,另外一种是小端法。(小端法就是最高有效位在后,最低有效位在前,大端法就相反)而决定使用什么方法是有机器决定的,不是编译器,所以我认为书本的这句话是错误的。 (3):for (int j = 7; j >= 0; --j) cout << (c >> j & 1); 解释c>>j要结合那个循环来讲,而且要使用位运算符来解释,因为在第一那里我们就是先按字节来提取d这个值了,然后一个字节是8位,所以要循环八次,把每个字节里的二进制读出来,而这里读二进制的方法是使用移位和相与的方法来实现的,其中(c>>j)就是移位,">>"这个是右移的意思,我举个例子: 有个二进制数:0111,我要得到第一个0,向右移三位得到:000 0,这样 我就得到那个0了 然后我在说说你的代码:你的思路是错误的,首先你要知道浮点数在机器里是按照什么规则存储的,它不是把整数部分变为二进制,再把小数部分变为二进制,然后结合在一起的。浮点数变为二进制是有不同的规定的,它的表示规则称为:IEEE标准,浮点数的二进制表示是一个复杂的问题,这里也说不清,我给你推荐一个博客: http://blog.csdn.net/richerg85/article/details/20456969
Miqiuha 2016-08-28
  • 打赏
  • 举报
回复

正确的运行结果!

64,647

社区成员

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

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