搜索
bottom↓
回复: 1

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

[复制链接]

出0入0汤圆

发表于 2008-1-28 21:49:56 | 显示全部楼层 |阅读模式
////////////////////
BCD码数据12345678放在数组unsigned char bcd[4]中;
即bcd[0]=0x78;bcd[1]=0x56;bcd[2]=0x34;bcd[3]=0x12;
想把该BCD码数据12345678;变成HEX数据放到unsigned char hex[4]里;

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2008-1-29 14:14:38 | 显示全部楼层
把这个(long)(10000*(bcd[c2+2]&0x0F)) ===>10000为int(/带符号的整形)型,乘上一个大于7(/4)的数,但结果还是int,就要溢出了.外面转成long已经没有用了.
换成((long)10000*(bcd[c2+2]&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的时候,它就是例题的.你的"???!!!"还是给自己打吧.

大过年的,上海下雪了,天气很冷.可是看到这个,还是汗颜.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-2 19:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表