kokan 发表于 2008-1-28 21:49:56

icc对long型数据到底支持多少???!!!

////////////////////
BCD码数据12345678放在数组unsigned char bcd中;
即bcd=0x78;bcd=0x56;bcd=0x34;bcd=0x12;
想把该BCD码数据12345678;变成HEX数据放到unsigned char hex里;

具体如下:
定义共用体:
union
   {
      unsigned long lg1;
      unsigned char cc;
   } convert;
////把BCD转换为DEC////////////////
convert.lg1=(long)(10000000*(bcd>>4))+(long)(1000000*(bcd&0x0F));
convert.lg1+=(long)(100000*(bcd>>4))+(long)(10000*(bcd&0x0F));
convert.lg1+=(int)(1000*(bcd>>4))+(int)(100*(bcd&0x0F));
convert.lg1+=10*(bcd>>4)+(bcd&0x0F);   
//////让ICCAVR自动把DEC转为HEX//////////////
hex=convert.cc;
hex=convert.cc;
hex=convert.cc;
hex=convert.cc;
/////////////////////
但程序运行时,常常出现的转换现象是:
得到的数,总比原数据少65536(10000H)?
/////////////////
真是令人头痛,这大过年的,也不让过好年,你说痛心不痛心;
期望高手指教啊

machao 发表于 2008-1-29 14:14:38

把这个(long)(10000*(bcd&0x0F)) ===>10000为int(/带符号的整形)型,乘上一个大于7(/4)的数,但结果还是int,就要溢出了.外面转成long已经没有用了.
换成((long)10000*(bcd&0x0f)    ====>应该先将10000转换成long,再运算.

是你自己的C基础不过关,不是ICCAVR的问题呀.

convert.lg1 = 0;
for (i=3;i>=0;i--)
{
convert.lg1 = 10 * convert.lg1 + (bcd>>4);
convert.lg1 = 10 * convert.lg1 + (bcd&0x0f);
}

这是标准的BCD转二进制的方法,N年前我教学生C的时候,它就是例题的.你的"???!!!"还是给自己打吧.

大过年的,上海下雪了,天气很冷.可是看到这个,还是汗颜.
页: [1]
查看完整版本: icc对long型数据到底支持多少???!!!