skynet 发表于 2012-7-18 10:45:47

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


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

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

        ulong zk_addr = 0;//字库起始地址
        uchar nm = {0};//汉字内码
         zk_addr = 0x00+((nm-0xa0-1)*0x5e+(nm-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

anvy178 发表于 2012-7-18 11:39:05

project->options->xlink->include->override default打勾选择相应的*.xcl,并在该文件中将-e_small_write=_formatted_write行注销掉,否则就有你的现象出现了,那是小模式,编译的程序代码小,但不支持长整型数,去掉后就支持长整型数了

chinabn 发表于 2012-7-18 11:48:43

zk_addr = 0x00+((nm-0xa0-1)*0x5eUL+(nm-0xa0-1))*0x20UL;

jetlib 发表于 2012-7-19 20:01:25

anvy178 发表于 2012-7-18 11:39 static/image/common/back.gif
project->options->xlink->include->override default打勾选择相应的*.xcl,并在该文件中将-e_small_write=_ ...

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

skynet 发表于 2012-7-19 20:18:11

楼上,这是IAR下才会这样,MDK下没这问题,实测过的

jlhgold 发表于 2012-7-19 20:48:17

不幸的告诉LZ 我在430下还真的做了汉字字库 还真心木有发现有这个问题 莫非是我的写法和懒洋洋的不一样?
也是在IAR下的
页: [1]
查看完整版本: 430的ulong数据,为什么计算会错误呢?求教