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)?
/////////////////
真是令人头痛,这大过年的,也不让过好年,你说痛心不痛心;
期望高手指教啊 把这个(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]