重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
unsigned int i, j, sum;,改为int i, j, sum;无符号的没有负数,所有i=0永远成立,死循环啦,同学
成都创新互联公司是一家专注于网站建设、成都网站制作与策划设计,维西网站建设哪家好?成都创新互联公司做网站,专注于网站建设10余年,网设计领域的专业建站公司;建站业务涵盖:维西等地区。维西做网站价格咨询:18980820575
数据在内存中本来就是以二进制补码存放的,设法从高字节至低字节一个bit一个bit地输出到屏幕上即可。根据题面要求,输出过程还要做以下工作:
从最高字节开始检测,全0的字节略去;
每8位增加输出一个空格。
代码如下:
12345678910111213141516//#include "stdafx.h"//If the vc++6.0, with this line.#include "stdio.h"int main(void){ char *p; unsigned i,n,x=1sizeof(int)*8-1; printf("Input an integer...\n"); scanf("%d",n); for(p=(char *)n,i=sizeof(int)-1;i0;i--) if(*(p+i)==0) x=8; else break; for(i=0;x;x=1) printf(++i%8 ? "%d" : "%d ",(nx) || 0); printf("\n"); return 0;}
根据评论要求,改进代码:
1、函数getBCode是题目要的递归函数,实现转二进制(最高位是符号位)。
思路是十进制数绝对值除以2求余,得到反向二进制原码,反向创建链表保存结果,最终得到的单向链表就是完整二进制数原码,之后根据正负性,负数取反+1。链表头添加符号位。
2、函数freeBny为释放链表,如要重复调用函数getBCode,每次调用需调用一次freeBny。
3、函数showBny是打印输出,为对齐显示,按4的倍数位打印,高位补齐的位数值均与符号位一致。
#include stdio.h
#include malloc.h
#include math.h
typedef struct binary//成员用char类型保存数值,不是'1'或'0'的ASCII码
{
char b;//一位二进制数0或1
struct binary *next;
}BNY;
BNY *getBCode(int n);//获得二进制数(最高位是符号位)
void showBny(BNY *bnyHead);//对齐打印二进制数(保证是4的倍数)
void freeBny(BNY *bnyHead);//释放二进制数链表空间
int main()
{
int n;
BNY bny,*bnyHead=bny;
while(1)
{
printf("请输入一个整数:"),scanf("%d",n);
bnyHead-next=getBCode(n);
printf("转为二进制数:"),showBny(bnyHead);
freeBny(bnyHead);
printf("\n");
}
return 0;
}
void freeBny(BNY *bnyHead)
{
BNY *prev=NULL,*bny=NULL;
bny=bnyHead-next;
while(bny)
{
if(prev) prev-next=NULL,free(prev),prev=NULL;
prev=bny;
bny=bny-next;
}
bnyHead-next=NULL;
}
void showBny(BNY *bnyHead)
{
int i,f=-1,len=0,n=0;
BNY *bnySave=bnyHead;
while(bnyHead-next)
{
if(f==-1) f=bnyHead-next-b;
len++;
bnyHead=bnyHead-next;
}
if(len%4)
n=4-len%4;
for(i=0;in;i++)printf("%d",f);
bnyHead=bnySave;
while(bnyHead-next)
{
printf("%d",bnyHead-next-b);
n++;
if(n==4)printf(" "),n=0;
bnyHead=bnyHead-next;
}
}
BNY *getBCode(int n)
{
int s,y;
static BNY*bnyPrev=NULL;
static int cy=0,f=-1;//加1进位用
if(f==-1 n=0)f=1;
if(f==-1 n0)f=0,cy=1;
n=abs(n);
BNY *bnyNew=NULL;
s=n/2,y=n%2;
bnyNew=(BNY *)malloc(sizeof(BNY));
if(!bnyNew) return NULL;
bnyNew-b=y;
// 如是负数,直接取反+1
if(!f) bnyNew-b=!(bnyNew-b);//从最低位开始,负数取反
if(cy)bnyNew-b=bnyNew-b+cy,cy=0;//负数+1
if(bnyNew-b1)bnyNew-b=0,cy=1;
bnyNew-next=NULL;
if(bnyPrev) bnyNew-next=bnyPrev;
bnyPrev=bnyNew;
n=s;
if(n==0)
{
bnyNew=(BNY *)malloc(sizeof(BNY));//添加符号位
if(!bnyNew) return NULL;
if(!f)
bnyNew-b=1;
else
bnyNew-b=0;
bnyNew-next=bnyPrev;
bnyPrev=NULL;
cy=0,f=-1;
return bnyNew;
}
return getBCode(n);
}
c语言中没有二进制的格式输出符号.你可以用itoa函数很方便的将一个10进制int转变成二进制字符串.如:inti;chars[128];scanf("%d",i);itoa(i,s,2);/*3个参数,第一个是待转换的数,第二个是存放转换后的字符串,第三个即需要转换的进制*/printf("该数转换为二进制是:[%s]\n",s);补充一点,itoa函数的头文件是stdlib.hjava中二进制数可以用0b来表示,主要的是你要注意0b后面的数字不能有超过1小于0的数。举个列子吧看下面的代码:publicclassJinZhi{publicstaticvoidmain(String[]args){inta10=12;inta8=0b12;System.out.println("十进制12等于"+a10);System.out.println("八进制12等于"+a8);}}该段代码运行时会报错显示0b后面的数字1和2之间没有打“;”,这是因为0b的后面表示的数字是二进制数不能出现超过1的数字。当吧0b后面数字改成11111111(8个1)后,输出了结果255