论坛风格切换切换到宽版
  • 3729阅读
  • 15回复

请教个数据转换问题 [复制链接]

上一主题 下一主题
离线河马漫步
 
发帖
1498
只看楼主 倒序阅读 0楼 发表于: 2008-09-09
6位十进制数怎么转换成十六进制数呢,初学c语言,搞不太懂,下面是4位转换的正常,再加两位怎么就不知道怎么做了,dx指点下下。

hb=haibai_disp[2]*1000+haibai_disp[3]*100+haibai_disp[4]*10+haibai_disp[5];

前面还有两位disp[0]和disp[1]怎么加进去呢?
离线汤圆
发帖
1157
只看该作者 1楼 发表于: 2008-09-09
你这个是按权作十进制转化啊
离线河马漫步
发帖
1498
只看该作者 2楼 发表于: 2008-09-10
[quote=汤圆]你这个是按权作十进制转化啊[/quote]

初学不太理解呀。
离线BG4UVR
发帖
11287
只看该作者 3楼 发表于: 2008-09-10
楼主可能把事情想复杂了。

按照楼主的例子,应该是把单独的6个10进制的位,转换成一个16进制数。而6位的10进制数,最大可以表示的值为999999,这样一个数值,双字节整数已经显然不行了,需要4字节。(估计楼主可能就是这个结果的声明搞错了)

所以简单的计算就可以了:
uint32_t b;
b=disp[0]*100000+disp[1]*10000+disp[2]*1000+disp[3]*100+disp[4]*10+disp[5];
离线河马漫步
发帖
1498
只看该作者 4楼 发表于: 2008-09-10
unsigned long hb;
unsigned char haibai_disp[6];

hb=haibai_disp[0]*100000+haibai_disp[1]*10000+haibai_disp[2]*1000+haibai_disp[3]*100+haibai_disp[4]*10+haibai_disp[5];

这样的算法对否???
离线BG4UVR
发帖
11287
只看该作者 5楼 发表于: 2008-09-10
[quote=河马漫步]unsigned long hb;
unsigned char haibai_disp[6];

hb=haibai_disp[0]*100000+haibai_disp[1]*10000+haibai_disp[2]*1000+haibai_disp[3]*100+haibai_disp[4]*10+haibai_disp[5];

这样的算法对否???[/quote]

你这个和我写的好像是一样的啊
离线河马漫步
发帖
1498
只看该作者 6楼 发表于: 2008-09-10
uint32_t 是不是unsigned long??可是这样还是不行呢
离线BG4UVR
发帖
11287
只看该作者 7楼 发表于: 2008-09-10
[quote=河马漫步]uint32_t 是不是unsigned long??可是这样还是不行呢[/quote]

怎么个不行法?

如果是结果明显不对,那应该是需要强制转换。[0]位和[1]位,前面要加上个:

(unsigned long)

注意,括号也是需要的



直接写上算了:
hb=(unsigned long)haibai_disp[0]*100000+(unsigned long)haibai_disp[1]*10000+haibai_disp[2]*1000+haibai_disp[3]*100+haibai_disp[4]*10+haibai_disp[5];
离线BG4UVR
发帖
11287
只看该作者 8楼 发表于: 2008-09-10
估计你下一个回帖会说搞定了,我先下班了
离线河马漫步
发帖
1498
只看该作者 9楼 发表于: 2008-09-10
目的是用按键设置六个数字,再将这六个数字转换成十六进制用于计算,计算结果再转换成6位十进制数用于显示,实验出如果是四个数字一切正常,现在的问题是当haibai设置成uint时设置的六个数大于65536时就变成0了,如果haibai设置成ulong类型时设置的六个数大于69999后变成这个数减去一个65535,比如设置成070000,而显示出来的是4464(70000-65535)!!!???
离线BG4UVR
发帖
11287
只看该作者 10楼 发表于: 2008-09-10
[quote=河马漫步]目的是用按键设置六个数字,再将这六个数字转换成十六进制用于计算,计算结果再转换成6位十进制数用于显示,实验出如果是四个数字一切正常,现在的问题是当haibai设置成uint时设置的六个数大于65536时就变成0了,如果haibai设置成ulong类型时设置的六个数大于69999后变成这个数减去一个65535,比如设置成070000,而显示出来的是4464(70000-65535)!!!???[/quote]

对的,是数在做乘法的时候溢出了,按我上面说的进行强制转换吧
离线河马漫步
发帖
1498
只看该作者 11楼 发表于: 2008-09-10
uchar displaybuffer[6];

change2display(haibai,displaybuffer)   //主函数里

//将十六进制数转换成用于显示的数
void change2display(unsigned long tempint,uchar *dbufferptr)
{
     *dbufferptr = tempint/100000;
     dbufferptr++;
     tempint=tempint%100000;
     *dbufferptr = tempint/10000;
     dbufferptr++;
     tempint=tempint%10000;
     *dbufferptr = tempint/1000;
     dbufferptr++;
     tempint=tempint%1000;
     *dbufferptr = tempint/100;
     dbufferptr++;
     tempint=tempint%100;
     *dbufferptr = tempint/10;
     dbufferptr++;
     *dbufferptr=tempint%10;
     retwdt;
}
这是反转的程序,有问题吗???
离线河马漫步
发帖
1498
只看该作者 12楼 发表于: 2008-09-10
先谢了,我再试试,呵呵
离线河马漫步
发帖
1498
只看该作者 13楼 发表于: 2008-09-11
为啥还是不行呢
离线BG4UVR
发帖
11287
只看该作者 14楼 发表于: 2008-09-11
慢慢搞,这是每个学写程序的人必须要经历的一个过程

每次写代码最后都演变成一场排错抓虫大战,直到现在我也是如此
离线河马漫步
发帖
1498
只看该作者 15楼 发表于: 2008-09-13
'
慢慢搞,这是每个学写程序的人必须要经历的一个过程
每次写代码最后都演变成一场排错抓虫大战,直到现在我也是如此
'

3q-uvr,还是没搞清,换了一种笨方法搞定了,改天无聊的时候再看看这段,呵呵。