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

[复制链接]
 楼主| 会流泪的鱼 发表于 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
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];
么?
 楼主| 会流泪的鱼 发表于 2007-10-15 14:25 | 显示全部楼层

谢谢

看了你的网页了,对于((unsigned char *)&n)[1]=i[0];这条还是看不懂,呵呵有可能人笨吧,我就强记算了!!!
computer00 发表于 2007-10-15 14:37 | 显示全部楼层

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

ayb_ice 发表于 2007-10-15 17:53 | 显示全部楼层

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

沈老 发表于 2007-10-15 21:07 | 显示全部楼层

不如用union好.

 楼主| 会流泪的鱼 发表于 2007-10-16 07:53 | 显示全部楼层

为什么说没有union好??

为什么说没有union好??用union怎么做???
沈老 发表于 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

粉丝
快速回复 在线客服 返回列表 返回顶部

9

主题

34

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部