写单片机程序数据类型相关
2013-10-14 15:01
253 查看
最近在调试单片机程序,总是遇到一些开始认为不可思议的事情,后来解决了问题后发现,都是因为自己书写程序不严谨,其主要原因是没有注意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型。问题解决。
对有符号、无符号数据的使用存在误区,对类型转换理解不到位。下面就举例一一说明:
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型。问题解决。
相关文章推荐
- 写单片机程序数据类型相关
- Google的三个实用搜索技巧
- 写单片机程序数据类型相关 分类: c51 单片机学习 2013-10-14 15:01 373人阅读 评论(0) 收藏
- NetworkReachable学习笔记
- Android中Bitmap缓存池zz
- Linux操作系统下生成一个指定大小的文件
- Ubuntu 12.04更新源
- jQuery禁止鼠标右键
- Vi/Vim快捷键
- 使用CPAN安装Perl模块
- 解决:安装SQl 2008为SQL Server代理服务提供的凭据无效
- jQuery取得iframe中元素方法
- ArrayList<String> 转化为String数组问题
- Oracle DB 查看预警日志
- ORACLE分析函数(1)
- hdu 4726
- 机制与策略
- Maven 集成Tomcat插件
- 常用的入侵端口
- IOS APP的图标尺寸、启动画面尺寸、宣传画面尺寸