博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
写单片机程序数据类型相关 分类: c51 单片机学习 ...
阅读量:5263 次
发布时间:2019-06-14

本文共 941 字,大约阅读时间需要 3 分钟。

最近在调试单片机程序,总是遇到一些开始认为不可思议的事情,后来解决了问题后发现,都是因为自己书写程序不严谨,其主要原因是没有注意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型。问题解决。

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/zhanglianpin/p/4622316.html

你可能感兴趣的文章
国外常见互联网盈利创新模式
查看>>
Oracle-05
查看>>
linux grep 搜索查找
查看>>
Not enough free disk space on disk '/boot'(转载)
查看>>
android 签名
查看>>
android:scaleType属性
查看>>
SuperEPC
查看>>
mysql-5.7 innodb 的并行任务调度详解
查看>>
shell脚本
查看>>
Upload Image to .NET Core 2.1 API
查看>>
Js时间处理
查看>>
Java项目xml相关配置
查看>>
三维变换概述
查看>>
vue route 跳转
查看>>
【雷电】源代码分析(二)-- 进入游戏攻击
查看>>
Entityframework:“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常。...
查看>>
Linux中防火墙centos
查看>>
mysql新建用户,用户授权,删除用户,修改密码
查看>>
FancyCoverFlow
查看>>
JS博客
查看>>