找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2759|回复: 8
打印 上一主题 下一主题
收起左侧

一个奇怪二维数组运算问题,走过路过的单片机大神们给个解释

[复制链接]
跳转到指定楼层
楼主
ID:388809 发表于 2018-8-25 15:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定义一个二维数组 并初始化 unsigned char   A[11][12]={0};定义一个  unsigned long  int   T=0;
其中A数组每个元素 只赋值0到9之间   
执行以下运算后 T=A[1][0]*10000+A[1][1]*1000+A[1][2]*100+A[1][3]*10+A[1][4];
T的范围应该在0到99999之间
但是实际结果T的值却只能在 0到65535之间 这是为什么,若A[1][0]>6,整个数据就乱了


但如果T的表达式 做成下面这样  
T=A[1][0]*10000;
T= T+A[1][1]*1000+A[1][2]*100+A[1][3]*10+A[1][4];
实际结果T的值就能在 0到99999之间

若是将数组 定义成 unsigned long int 型
执行以下运算后 T=A[1][0]*10000+A[1][1]*1000++A[1][2]*100+A[1][3]*10+A[1][4];
实际结果T的值也能在 0到99999之间


请问大神们 这是什么缘故    ,单片机是使用STC15F2K系列
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:98526 发表于 2018-8-25 16:07 | 只看该作者
常量数字后面加上ul。比如A[1][0] * 10000UL

评分

参与人数 1黑币 +5 收起 理由
城江伍佬 + 5 赞一个!

查看全部评分

回复

使用道具 举报

板凳
ID:80221 发表于 2018-8-25 16:51 | 只看该作者
第一个变量类型占16bit ,所以最大值只有65535,第二个等式T= T+A[1][1]*1000+A[1][2]*100+A[1][3]*10+A[1][4],右侧做了强制类型转换变成了long int,32bit。

评分

参与人数 1黑币 +5 收起 理由
城江伍佬 + 5 赞一个!

查看全部评分

回复

使用道具 举报

地板
ID:388809 发表于 2018-8-25 17:34 | 只看该作者
726434632 发表于 2018-8-25 16:07
常量数字后面加上ul。比如A[1][0] * 10000UL

按照你说的做  确实可以    受教了    谢谢  ,这样子做会增加代码长度 好像每加1个UL就会多12个字节
回复

使用道具 举报

5#
ID:388809 发表于 2018-8-25 17:49 | 只看该作者
a庚 发表于 2018-8-25 16:51
第一个变量类型占16bit ,所以最大值只有65535,第二个等式T= T+A[1][1]*1000+A[1][2]*100+A[1][3]*10+A[1] ...

请问   为什么第一个变量是16bit,能否解释的简单明了点,对于数据这块我是小白
回复

使用道具 举报

6#
ID:277550 发表于 2018-8-25 22:54 | 只看该作者


不同的数据类型,不同的位数,还是先仔细看看吧,,,,KeilC51\C51\hlp\c51.chm

评分

参与人数 1黑币 +5 收起 理由
城江伍佬 + 5

查看全部评分

回复

使用道具 举报

7#
ID:80221 发表于 2018-8-26 16:47 | 只看该作者
城江伍佬 发表于 2018-8-25 17:49
请问   为什么第一个变量是16bit,能否解释的简单明了点,对于数据这块我是小白

因为第一个等式右边是同一类型的变量相加,即insigned char 类型,而另外一个是unsigned char +unsigned long int,编译器把类型都转成了unsigned long int型,你用整型和浮点数运算,也能看到浮点的结果。(片子支持浮点的话)
回复

使用道具 举报

8#
ID:388809 发表于 2018-8-27 19:50 | 只看该作者
a庚 发表于 2018-8-26 16:47
因为第一个等式右边是同一类型的变量相加,即insigned char 类型,而另外一个是unsigned char +unsigned  ...

明了明了  
回复

使用道具 举报

9#
ID:390775 发表于 2018-8-31 16:37 | 只看该作者
但是实际结果T的值却只能在 0到65535之间 这是为什么
跟你实际用的操作系统是多少位的有关
unsigned long  int   T=0; 有的在32位系统下分配的是  2个字节(最大为65535,当你的实际值大于65535时  会出现溢出)  在64位下分配的是 4个字节  

建议你把  T定义成unsigned  int类型  因为 int类型 比较稳定 一把 32和64位系统 都是4个字节
而且最大值  大于你实际用的最大值(99999) 。
希望对你有帮助
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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