注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

 
 
 

日志

 
 

聊聊C语言 之 [002] 数据类型引发的程序异常  

2013-02-21 13:51:02|  分类: DIY-技术-软件 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

聊聊C语言 之 [002] 数据类型引发的程序异常 - 子时DIY - 子时DIY
        我们在使用C语言进行程序设计时常常定义很多变量。对于每一个变量来说都有其特定的变量类型,比如“整型”就是我们使用较为频繁的一种变量类型。

对于像“整型”这种数据类型它更多表达的是一种数据的范围,就拿“signed char”这个类型来说吧,这个类型通常在C语言中所表示的数据范围是[-128, 127](这里说的是通常,的确有例外情况),如果我们所要表示的数据范围不在[-128, 127]中,我们最好不要使用“signed char”这个类型,比如我们要存储“飞机的飞行高度”值(单位是米),那么使用“signed char”这个类型就不合适了。

我们的题目是《数据类型引发的程序异常》,那么数据类型会为我们的程序带来哪些问题呢?我们可以看一段代码,如图002-01:

聊聊C语言 之 [002] 数据类型引发的程序异常 - 子时DIY - 子时DIY

为了说明问题,程序功能很简单,逆序输出0-100。输出结果如图002-02:

聊聊C语言 之 [002] 数据类型引发的程序异常 - 子时DIY - 子时DIY

实际上这段程序存在一定隐患,尤其是当我们移植这段程序到其他平台的时候问题就可能出现。问题的隐患来自于“数据类型”,假设我们重写这段程序如图002-03:

聊聊C语言 之 [002] 数据类型引发的程序异常 - 子时DIY - 子时DIY

程序仅仅修改了变量n的数据类型,修改后的程序将是一个无线的循环,程序首先输出100-0,然后会不断输出255-0,原因主要是由于n的类型是unsigned char那么n将永远大于等于0,所以程序中的while循环将永无止境的执行。

所以当我们的程序出现死循环的时候,一定要考虑是否是数据类型引发的程序异常。那么如果将n定义成char类型就一定没有问题吗,当然不是的,因为有些编译器在处理char这个类型的时候将其看成无符号数,这样编译出的程序仍然是个死循环,比如在ARM架构下的一些编译器就将char这类型当成unsigned char来处理。

为了避免这些问题,我们在写程序时可以更加严谨一些,如图002-04:

聊聊C语言 之 [002] 数据类型引发的程序异常 - 子时DIY - 子时DIY

我们可以把char改成signed char明确告诉编译器我们想定义的变量是有符号char类型。

在很多项目中比如μCOS源码中我们可以看到很多数据类型为INT8、INT8U、INT16、INT16U……等类型,这些类型是项目开发人员自己定义的数据类型如图002-05:

聊聊C语言 之 [002] 数据类型引发的程序异常 - 子时DIY - 子时DIY

INT8这种写法可以明确说明数据类型是否有符号以及它所表示的数据范围。当然不同的环境(软硬件环境)下INT8、INT8U、INT16、INT16U等的定义形式可能是不同的,所以在进行代码移植时,首先要修改INT8、INT8U、INT16、INT16U等数据类型的定义。

 

  评论这张
 
阅读(113)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017