打印

问下KEIL C里编多字节加减的问题

[复制链接]
2128|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
会流泪的鱼|  楼主 | 2007-10-15 09:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我最近搞一个程序要用到3字节的就量加减,但我用LONG做的话简单的合起来就用了200多个字节,接下去的运算、存储、转成BCD显示就太大了。
有什么方法可以搞得小点吗??
我编的程序如下:

     #include<reg52.h>
     #include<2051sz.h>
     
     
     
     uchar i[3]={100,102,104};
     ulong n;
     
     
     void main(void)
     {
      for(;;)
      {
       n=0;
       n=(((((n+i[0])<<8)+i[1])<<8)+i[2]);
      }
     }   
就是把I的三个变量合到N里
感觉这个方法是用问题的,有什么更好的方法可以解决吗??在线等回答!!!

相关帖子

沙发
computer00| | 2007-10-15 09:51 | 只看该作者

这样:

((unsigned char *)&n)[1]=i[0];
((unsigned char *)&n)[2]=i[1];
((unsigned char *)&n)[3]=i[2];

最后的结果是按i里面的16进制值连接,而不是十进制。

使用特权

评论回复
板凳
会流泪的鱼|  楼主 | 2007-10-15 10:36 | 只看该作者

不错,这样生成的代码是小了很多

((unsigned char *)&n)[1]=i[0];这段我有点看不懂可以解释下吗??指针学得不好,呵呵

还有我要把N转成10进制,是不是用除余的方**?因为需要显示

使用特权

评论回复
地板
computer00| | 2007-10-15 11:05 | 只看该作者

可以用除10取余的方式。

关于指针,可以看看我写的这个:
相关链接:http://computer00.21ic.org/user1/2198/archives/2007/41252.html

使用特权

评论回复
5
zssmcu| | 2007-10-15 13:38 | 只看该作者

不是应该((unsigned char *)&n)[0]=i[0];么???

不是应该
((unsigned char *)&n)[0]=i[0];
((unsigned char *)&n)[1]=i[1];
((unsigned char *)&n)[2]=i[2];
么?

使用特权

评论回复
6
会流泪的鱼|  楼主 | 2007-10-15 14:25 | 只看该作者

谢谢

看了你的网页了,对于((unsigned char *)&n)[1]=i[0];这条还是看不懂,呵呵有可能人笨吧,我就强记算了!!!

使用特权

评论回复
7
computer00| | 2007-10-15 14:37 | 只看该作者

楼主只有3个字节,而keil C是大端结构,所以应该放后面

使用特权

评论回复
8
ayb_ice| | 2007-10-15 17:53 | 只看该作者

只要FLASH够,大点没关系...

使用特权

评论回复
9
沈老| | 2007-10-15 21:07 | 只看该作者

不如用union好.

使用特权

评论回复
10
会流泪的鱼|  楼主 | 2007-10-16 07:53 | 只看该作者

为什么说没有union好??

为什么说没有union好??用union怎么做???

使用特权

评论回复
11
沈老| | 2007-10-16 19:17 | 只看该作者

用union

typedef union
{
    unsigned long L;
    unsigned char B[4];
} MyLong;
void main(void)
{
    MyLong myl;
    unsigned char b[4];
    myl.L=0x12345678;
    
    b[0]=myl.B[0];//0x12
     b[1]=myl.B[1];//0x34
    b[2]=myl.B[2];//0x56
    b[3]=myl.B[3];//0x78
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

34

帖子

1

粉丝