打印
[STC单片机]

求救~STC怎么运算大于65535的数据啊?

[复制链接]
3721|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
moody21983|  楼主 | 2013-12-12 20:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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

使用特权

评论回复
5
moody21983|  楼主 | 2013-12-12 21:05 | 只看该作者
酸梅粉 发表于 2013-12-12 21:02
可不可以缩小100倍再计算,让结果不超过65535

不行啊,这个数据是保存到EEPROM中的,然后再读出来,读出来的时候数据是正确的,但是拼装成32位数据就不能运算了,很迷糊啊

使用特权

评论回复
6
NE5532| | 2013-12-12 21:24 | 只看该作者
那总是你拼装有问题三。

使用特权

评论回复
7
moody21983|  楼主 | 2013-12-12 21:29 | 只看该作者
NE5532 发表于 2013-12-12 21:24
那总是你拼装有问题三。

拼装没有问题的,啊,我没进EEPROM,直接用变量整除试验了下
我用CountY= 360*800,后,CountY/800 =32,输出,这个main里没有别的难道STC的单片机只能运算16位?

使用特权

评论回复
8
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

使用特权

评论回复
9
NE5532| | 2013-12-12 22:04 | 只看该作者
360*800=288000,已经超过了int型的表达范围,可以定义Long型变量来计算就可以了,任何单片机都可以运算任何复杂的数据类型,只是速度快慢有区别而已。

使用特权

评论回复
10
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都没有。

使用特权

评论回复
11
coody| | 2013-12-13 10:58 | 只看该作者
STC无关,所有51都一样,用unsigned long或long就可以了

使用特权

评论回复
12
max_v| | 2013-12-13 13:05 | 只看该作者
这是个问题

使用特权

评论回复
13
gaoyang9992006| | 2013-12-13 16:30 | 只看该作者
楼主你会笔算两个很大的数相乘吗?
你会的话就可以用C实现你计算的过程。
你定义两个字符串,分别存放乘数和被乘数,你的明白??

使用特权

评论回复
14
gaoyang9992006| | 2013-12-13 16:31 | 只看该作者
楼主你会笔算两个很大的数相乘吗?
你会的话就可以用C实现你计算的过程。
你定义两个字符串,分别存放乘数和被乘数,你的明白??

使用特权

评论回复
15
gaoyang9992006| | 2013-12-13 16:32 | 只看该作者
你直接定义unsigned char 数组就够了

使用特权

评论回复
16
原野之狼| | 2013-12-13 17:14 | 只看该作者
1) 把16位变量弄成32位变量甚至更长。
2) 若还是不够的话,可以弄成浮点来计算,但是精度会受损。
3) 若对精度有要求,那就自己写算法实现,你打草稿运算时的步骤用计算机语言描述出来就是了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

1

粉丝