[STC单片机] 求救~STC怎么运算大于65535的数据啊?

[复制链接]
4610|15
 楼主| moody21983 发表于 2013-12-12 20:26 | 显示全部楼层 |阅读模式
stc, tc, ST
CountY= 360*800;
       
然后CountY/800 就只等于32 不等于360
这个 需要怎么办,啊求高手
 楼主| moody21983 发表于 2013-12-12 20:28 | 显示全部楼层
uint32 CountX,CountY,CountZ;
typedef unsigned long                uint32;
 楼主| moody21983 发表于 2013-12-12 20:33 | 显示全部楼层
typedef unsigned long                uint32;
uint32 CountX,CountY,CountZ;
360*800= 288000;实际是262144+25856     换成8位  ,00  , 04   ,101  ,00
已经定义32位数据了,可以算加减法但是不能算除法 不知道为什么,求高手帮忙解答下,非常感谢
比如CountY-280000得出8000;
酸梅粉 发表于 2013-12-12 21:02 | 显示全部楼层
可不可以缩小100倍再计算,让结果不超过65535
 楼主| moody21983 发表于 2013-12-12 21:05 | 显示全部楼层
酸梅粉 发表于 2013-12-12 21:02
可不可以缩小100倍再计算,让结果不超过65535

不行啊,这个数据是保存到EEPROM中的,然后再读出来,读出来的时候数据是正确的,但是拼装成32位数据就不能运算了,很迷糊啊
NE5532 发表于 2013-12-12 21:24 | 显示全部楼层
那总是你拼装有问题三。
 楼主| moody21983 发表于 2013-12-12 21:29 | 显示全部楼层
NE5532 发表于 2013-12-12 21:24
那总是你拼装有问题三。

拼装没有问题的,啊,我没进EEPROM,直接用变量整除试验了下
我用CountY= 360*800,后,CountY/800 =32,输出,这个main里没有别的难道STC的单片机只能运算16位?
 楼主| moody21983 发表于 2013-12-12 21:32 | 显示全部楼层
NE5532 发表于 2013-12-12 21:24
那总是你拼装有问题三。

        CountX        = 288000;
        CountY = 360*800;
        print12864strnum(LCD20,CountX);        输出I865
        //print12864strnum(LCD30,(262144+25856)/800);输出360
        print12864strnum(LCD24,CountX/800);输出360                       
        print12864strnum(LCD34,(CountY/800));输出32
NE5532 发表于 2013-12-12 22:04 | 显示全部楼层
360*800=288000,已经超过了int型的表达范围,可以定义Long型变量来计算就可以了,任何单片机都可以运算任何复杂的数据类型,只是速度快慢有区别而已。
i55 发表于 2013-12-12 22:44 | 显示全部楼层
moody21983 发表于 2013-12-12 21:32
CountX        = 288000;
        CountY = 360*800;
        print12864strnum(LCD20,CountX);        输出I865

CountX  = 288000UL;

8051的编译器常数不加L修饰最大32767(signed)或者65535(unsigned),缺省都是singed,个别编译器某些编译选项会把int当成unsigned。

这个问题多数是因为现代x86编译器int类型是32位的,常数是int型,所以你以前的东西没出问题,而8位单片机int类型是16位的,这么搞一定overflow,连个warning都没有。
coody 发表于 2013-12-13 10:58 | 显示全部楼层
STC无关,所有51都一样,用unsigned long或long就可以了
max_v 发表于 2013-12-13 13:05 来自手机 | 显示全部楼层
这是个问题
gaoyang9992006 发表于 2013-12-13 16:30 | 显示全部楼层
楼主你会笔算两个很大的数相乘吗?
你会的话就可以用C实现你计算的过程。
你定义两个字符串,分别存放乘数和被乘数,你的明白??
gaoyang9992006 发表于 2013-12-13 16:31 | 显示全部楼层
楼主你会笔算两个很大的数相乘吗?
你会的话就可以用C实现你计算的过程。
你定义两个字符串,分别存放乘数和被乘数,你的明白??
gaoyang9992006 发表于 2013-12-13 16:32 | 显示全部楼层
你直接定义unsigned char 数组就够了
原野之狼 发表于 2013-12-13 17:14 | 显示全部楼层
1) 把16位变量弄成32位变量甚至更长。
2) 若还是不够的话,可以弄成浮点来计算,但是精度会受损。
3) 若对精度有要求,那就自己写算法实现,你打草稿运算时的步骤用计算机语言描述出来就是了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部