EDN首页   博客首页

日志档案

发表于 2008-8-27 12:47:51

1

标签: keil  c  移位  乘除  

keil c 的乘除与移位问题

看看下面的这个程序

#include "at89x51.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//#define bus P0  //lcd1602 êy?Y×ü??

void main()
{
while(1)
{
  uchar L="0x55";
  uchar M="0xaa";
  uchar H="0x05";
  ulong X;
  X=H*65536+M*256+L;
//  X=(H<<16)|(M<<8)|L;
}
}


本着确认的态度测试了一下keil 的移位代替乘除的效果,其中L,M,H后的数字只是我用来验证结果正误的,理论上说最后两句无论采用那句最终的X值都应该是0005aa55,但实际运行下来结果是不一样的,采用移位的方法的结果是0000aa55,

在华仔兄弟的提醒下,因为我这里的L,M,H都是uchar型,M*256已经溢出,更不用说H*65536了,正确的方法是把M定义位uint型,H定义为ulong型即可

仍以上面的为例进行编译,按照移位计算X值,最终code=118,而直接乘的话code=175,还是挺可观的!

实践是检验“理论”的唯一标准^_^

举手之劳,希望热心的兄弟姐妹帮忙点击宣传一下CEPark电子爱好者家园网站,给咱的宣传积分加点力^_^

系统分类: 单片机   |   用户分类: 零星代码备忘   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(422)    回复(1)  

投一票您将和博主都有获奖机会!

  • yanwuxu

    2008-8-28 13:05:11

    我崇拜的鱼版主给出了下面的代码,更简练^_^ ulong X; uchar L=0x55; uchar M=0xaa; uchar H=0x05; X=H; X<<=16; X|=L|(M<<8);