搜索
bottom↓
回复: 5

430的ulong数据,为什么计算会错误呢?求教

[复制链接]

出0入12汤圆

发表于 2012-7-18 10:45:47 | 显示全部楼层 |阅读模式

编译器是IAR,5.3的,优化选择NONE了,很简单的1个计算

typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;

        ulong zk_addr = 0;//字库起始地址
        uchar nm[2] = {0};//汉字内码
           zk_addr = 0x00+((nm[0]-0xa0-1)*0x5e+(nm[1]-0xa0-1))*0x20;
        //汉字在字库中的起始地址,此公式为GB2312标准字库地址计算公式
       
等效就是这个,当汉字是 啊 这个字的时候,内码就是b0a1
zk_addr = 0x00 + ( (0xb0-0xa0-1)*94 + (0xa1-0xa0-1)) * 32;

结果 zk_addr  = 42949466880 晕死.....

如果 uint zk_addr = 0;//字库起始地址
结果就正确了 zk_addr = 45120

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-7-18 11:39:05 | 显示全部楼层
project->options->xlink->include->override default打勾选择相应的*.xcl,并在该文件中将-e_small_write=_formatted_write行注销掉,否则就有你的现象出现了,那是小模式,编译的程序代码小,但不支持长整型数,去掉后就支持长整型数了

出0入0汤圆

发表于 2012-7-18 11:48:43 | 显示全部楼层
zk_addr = 0x00+((nm[0]-0xa0-1)*0x5eUL+(nm[1]-0xa0-1))*0x20UL;

出0入0汤圆

发表于 2012-7-19 20:01:25 | 显示全部楼层
anvy178 发表于 2012-7-18 11:39
project->options->xlink->include->override default打勾选择相应的*.xcl,并在该文件中将-e_small_write=_ ...

以前DOS程序涉及内存寻址空间问题,有小模式,大模式甚至huge模式之分。而对于MSP430,每一个工程对应的芯片是固定的,寻址范围也就是固定的,就不需要自己改寻址模式了。
问题是因为楼主的公式中,每个运算单元都是UINT8型,结果每次计算都按UINT8来计算,算出的结果还是UINT8,然后付给一个UINT32型导致。属于C语言的基本问题。

出0入12汤圆

 楼主| 发表于 2012-7-19 20:18:11 | 显示全部楼层
楼上,这是IAR下才会这样,MDK下没这问题,实测过的

出0入0汤圆

发表于 2012-7-19 20:48:17 | 显示全部楼层
不幸的告诉LZ 我在430下还真的做了汉字字库 还真心木有发现有这个问题 莫非是我的写法和懒洋洋的不一样?
也是在IAR下的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-28 06:32

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

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