将8进制数字转换成10进制 20
程序描述:1.功能八进制转换为十进制代码如下#include<stdio.h>main(){char*p,s[6];intn;p=s;gets(p);n=0;while(...
程序描述:
1.功能
八进制转换为十进制
代码如下
#include<stdio.h>
main()
{ char *p,s[6];
int n;
p=s;
gets(p);
n=0;
while(*(p)!='\0')
{n=n*8+*p-'0';
p++;}
printf("%d",n);
}
我的疑问:
1.复合语句
while(*(p)!='\0')
{n=n*8+*p-'0';
p++;}
执行的条件是检测到数组内的字符不是“\0”,p++是变量自增,但是最关键的这一句n=n*8+*p-'0';我却看不懂。举个例子来说,如果输入的八进制数字是137那么计算相应的十进制数应该是n=1*8*8+3*8+7*1,可是我却和n=n*8+*p-'0';联系不上,看不出程序是怎么计算的。这是什么算法啊
2.我稍微明白一点的是数组中存储的是数字字符0-9每个对应不同的ASCI值,可是我记得在一定范围内int和char是通用的啊,为什么不能直接存储数字呢?
3.这个程序应该不能计算带有小数点的数字的进制转换,如果我型实现这一点该如何改动代码呢?
以上就是我的3点疑问,希望各位高手不吝赐教,谢谢! 展开
1.功能
八进制转换为十进制
代码如下
#include<stdio.h>
main()
{ char *p,s[6];
int n;
p=s;
gets(p);
n=0;
while(*(p)!='\0')
{n=n*8+*p-'0';
p++;}
printf("%d",n);
}
我的疑问:
1.复合语句
while(*(p)!='\0')
{n=n*8+*p-'0';
p++;}
执行的条件是检测到数组内的字符不是“\0”,p++是变量自增,但是最关键的这一句n=n*8+*p-'0';我却看不懂。举个例子来说,如果输入的八进制数字是137那么计算相应的十进制数应该是n=1*8*8+3*8+7*1,可是我却和n=n*8+*p-'0';联系不上,看不出程序是怎么计算的。这是什么算法啊
2.我稍微明白一点的是数组中存储的是数字字符0-9每个对应不同的ASCI值,可是我记得在一定范围内int和char是通用的啊,为什么不能直接存储数字呢?
3.这个程序应该不能计算带有小数点的数字的进制转换,如果我型实现这一点该如何改动代码呢?
以上就是我的3点疑问,希望各位高手不吝赐教,谢谢! 展开
1个回答
展开全部
1、八进制137计算过程如下:
n=0;指针p指向字符‘1’;
n=n*8+'1'-'0'=1;p++后,p指向‘3’;
n=n*8+'3'-'0'=11;p++后,p指向‘7’;
n=n*8+‘7’-‘0’=95;p++后,p指向‘\0’;
循环结束。最终n=95;
因为字符是用ascll码表示的,所以可以作为int使用。
楼主可以测试:int a='7'-'0';输出a,会发现a=7.
2、我不知道你具体想说什么,在内存中char和对应的int值是一样的,都是由1和0来表示。之所以表现形式不一样,是因为编译器帮你区分了它的类型。
3、八进制的小数?这个不要费心思了。会计算二进制的小数部分的转换就可以了。如果你实在想做,我可以说一下思路。小数部分要和整数部分分别做,然后相加。假设八进制数0.137,那么结果为1*0.125+3*0.125*0.125+7*0.125*0.125*0.125
具体实现的话你自己考虑一下吧。
n=0;指针p指向字符‘1’;
n=n*8+'1'-'0'=1;p++后,p指向‘3’;
n=n*8+'3'-'0'=11;p++后,p指向‘7’;
n=n*8+‘7’-‘0’=95;p++后,p指向‘\0’;
循环结束。最终n=95;
因为字符是用ascll码表示的,所以可以作为int使用。
楼主可以测试:int a='7'-'0';输出a,会发现a=7.
2、我不知道你具体想说什么,在内存中char和对应的int值是一样的,都是由1和0来表示。之所以表现形式不一样,是因为编译器帮你区分了它的类型。
3、八进制的小数?这个不要费心思了。会计算二进制的小数部分的转换就可以了。如果你实在想做,我可以说一下思路。小数部分要和整数部分分别做,然后相加。假设八进制数0.137,那么结果为1*0.125+3*0.125*0.125+7*0.125*0.125*0.125
具体实现的话你自己考虑一下吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询