4307|7

280

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

【程序设计】聊聊C语言 之 数据类型引发的程序异常 [复制链接]

       我们在使用C语言进行程序设计时常常定义很多变量。对于每一个变量来说都有其特定的变量类型,比如“整型”就是我们使用较为频繁的一种变量类型。
       对于像“整型”这种数据类型它更多表达的是一种数据的范围,就拿“signed char”这个类型来说吧,这个类型通常在C语言中所表示的数据范围是[-128, 127](这里说的是通常,的确有例外情况),如果我们所要表示的数据范围不在[-128, 127]中,我们最好不要使用“signed char”这个类型,比如我们要存储“飞机的飞行高度”值(单位是米),那么使用“signed char”这个类型就不合适了。
       我们的题目是《数据类型引发的程序异常》,那么数据类型会为我们的程序带来哪些问题呢?我们可以看一段代码,如图002-01:


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

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

       程序仅仅修改了变量n的数据类型,修改后的程序将是一个无线的循环,程序首先输出100-0,然后会不断输出255-0,原因主要是由于n的类型是unsigned char那么n将永远大于等于0,所以程序中的while循环将永无止境的执行。
       所以当我们的程序出现死循环的时候,一定要考虑是否是数据类型引发的程序异常。那么如果将n定义成char类型就一定没有问题吗,当然不是,因为有些编译器在处理char这个类型的时候将其看成无符号数,这样编译出的程序仍然是个死循环,比如在ARM架构下的一些编译器就将char这类型当成unsigned char来处理。
       为了避免这些问题,我们在写程序时可以更加严谨一些,如图002-04:


       我们可以把char改成signed char明确告诉编译器我们想定义的变量是有符号char类型。
       在很多项目中比如μCOS源码中我们可以看到很多数据类型为INT8、INT8U、INT16、INT16U……等类型,这些类型是项目开发人员自己重定义的数据类型如图002-05:


       INT8这种写法可以明确说明数据类型是否有符号以及它所表示的数据范围。当然不同的环境(软硬件环境)下INT8、INT8U、INT16、INT16U等的定义形式可能是不同的,所以在进行代码移植时,首先要重定义INT8、INT8U、INT16、INT16U等数据类型。这样可以尽量避免此类问题,因为在进行类型重定义时我们会关注不同开发环境的特性。


[ 本帖最后由 @ZiShi 于 2013-2-26 15:16 编辑 ]

最新回复

个人感觉编程编到最后就只是数据类型转换的过程了~  详情 回复 发表于 2013-6-11 18:16
点赞 关注
 

回复
举报

280

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
有关于数据类型的问题大家可以多多交流哦
 
 

回复

187

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
学习了

点评

互相学习:handshake  详情 回复 发表于 2013-4-26 09:43
 
 
 

回复

280

帖子

0

TA的资源

纯净的硅(中级)

4
 

回复 板凳 j03128 的帖子

互相学习
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

5
 
我也一直被數字型態所困擾.

点评

多多交流呦  详情 回复 发表于 2013-5-24 21:26
 
 
 

回复

280

帖子

0

TA的资源

纯净的硅(中级)

6
 

回复 5楼 pizg 的帖子

多多交流呦
 
 
 

回复

32

帖子

0

TA的资源

一粒金砂(初级)

7
 
个人感觉编程编到最后就只是数据类型转换的过程了~

点评

01的组合,哈哈  详情 回复 发表于 2013-6-11 21:45
 
 
 

回复

280

帖子

0

TA的资源

纯净的硅(中级)

8
 

回复 7楼 lanlanzhilian 的帖子

01的组合,哈哈
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表