登录|立即注册|使用QQ帐号登录
论坛 > 24小时必答区
发帖|
看2802|回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系列
沙发 ID:98526 只看他
2018-8-25 16:07
常量数字后面加上ul。比如A[1][0] * 10000UL
板凳 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。
地板 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
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黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版