您的位置:首页 > 其它

写单片机程序数据类型相关 分类: c51 单片机学习 2013-10-14 15:01 373人阅读 评论(0) 收藏

2013-10-14 15:01 344 查看
最近在调试单片机程序,总是遇到一些开始认为不可思议的事情,后来解决了问题后发现,都是因为自己书写程序不严谨,其主要原因是没有注意c语言的数据类型的数据范围。

对有符号、无符号数据的使用存在误区,对类型转换理解不到位。下面就举例一一说明:

1:一个简单的for循环,但因为数据溢出导致进入死循环,无法实现相应功能。

unsigned char i;

for(i=0;i<256;i++)

语句;

咋看起来这语句没有什么问题。但仔细考虑发现,i在此循环中会溢出,i的值 0---255---0----255----0-----------。

2:在循环里还需要注意的是有符号数和无符号数进行比较时:

unsigned char i;

i=230;

if(i>-5)

当无符号和有符号数进行比较时,会把无符号数转换为有符号数,i=230转换成有符号数是-26 因此if条件不成立。

3:使用printf或sprintf时,注意要打印的数值的数据类型,否则打印出来的不是你需要的。

4:注意在各个函数参数或者其他赋值时的数据类型的默认转换。考虑清楚的类型不匹配时,和默认类型转换不符时,可以使用强制类型转换。

5:昨天调试一个单片机汉字显示程序时,遇到数据简单运算结果不对的情况。

uchar ch0,ch1;

uint32 offset;

offset=(uint32) (HZ_BASE_ADDR+((((ch0 - 1) * 94) + (ch1 - 1))*32)); 这个语句算出的结果不对,开始不理解,后来发现还是数据类型的问题。原因是ch0是无符号字符类型的,因此((ch0 - 1) * 94) 的结果溢出。导致出错。修正方案:offset=(uint32) (HZ_BASE_ADDR+((((ch0 - 1) * 94L) + (ch1 - 1))*32L));
添加强制转换,把立即数强制为long int型数据,根据c语言默认数据类型提升方案,其他参与运算的数值也转换为long int型。问题解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: