最近在调试单片机程序,总是遇到一些开始认为不可思议的事情,后来解决了问题后发现,都是因为自己书写程序不严谨,其主要原因是没有注意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型。问题解决。
版权声明:本文为博主原创文章,未经博主允许不得转载。