打印

C语言中如何判断数据类型溢出?

[复制链接]
10276|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
349264710|  楼主 | 2012-4-22 17:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
众所周知,在C程序中不能随便定义数据类型,比如说A的取值范围是1~256,那么我们一般把A定义为unsigned int 或者是 int。问题是,假设我把A定义为unsigned char,那么当A=256时,数据类型溢出。记得51单片机中有个CY还是神马标志位表示数据类型溢出。请问用c语言如何判断A溢出了呢,那么不同的单片机方法一样吗?

相关帖子

沙发
airwill| | 2012-4-22 19:21 | 只看该作者
CY  溢出标志, 玩过汇编的人都非常熟悉溢出标志.
首先, CY (C) 是进位标志, 不是溢出标志, 溢出标志有专门的标志(ov) 位.
其次,  CY 这个进位标志, 只在进行运算是起作用.
象楼主 A=256 的操作是不好触发 CY 标志的.

最后来再谈数据类型溢出的避免问题. 的确, 这个问题很少有人提及, 但确实做应用中很麻烦, 而且往往即使在调试中也很容易忽视, 不容易发现而导致软件 BUG.
1. 程序员应该非常清楚其变量的可能范围, 并正确使用数据类型. 比如知道可能 0~256, 那就得使用 unsigned int 类型.
2. 很多时候往往出现问题在于中间过程(一个表达式的计算中间过程), 那就要求程序员为程序的健壮性, 增加足够范围类型的中间局部变量, 并有必要对可能溢出的运算, 提前做有效性判断.

使用特权

评论回复
评分
参与人数 3威望 +3 收起 理由
logokfu + 1 很在理
highgear + 1
john_lee + 1 我很赞同
板凳
xlsbz| | 2012-4-24 12:48 | 只看该作者
好像没法子判断吧   如果自增且速度不快的话  后一个小于前一个  就是溢出了

使用特权

评论回复
地板
liang7143| | 2012-4-24 14:10 | 只看该作者
好像没发现有什么管用的办法

使用特权

评论回复
5
349264710|  楼主 | 2012-4-24 22:02 | 只看该作者
2# airwill

在X86中数据类型溢出会触发一个中断,不知道有没有单片机支持这种中断~

使用特权

评论回复
6
airwill| | 2012-4-25 13:34 | 只看该作者
在X86中数据类型溢出会触发一个中断?  我玩这么久 X86, 怎么不知道呢?!  除了除法的除零会出现异常. 一般的计算溢出, x86 也没有中断哦!
对于除以零, 单片机也有反应. 不过没有这么强烈. 通常我们应该是计算前就判0.

使用特权

评论回复
7
highgear| | 2012-4-25 20:55 | 只看该作者
X86只有除零中断, 没有溢出中断。 有些 cpu 可以设置溢出截止的简单功能。
对付溢出,没有什么好的硬件方法, 只能靠程序员自己预判和提防。

使用特权

评论回复
8
yy251745080| | 2012-4-25 21:32 | 只看该作者
错误着写,错误着用。

使用特权

评论回复
9
hhhhhhgggg| | 2013-1-18 06:55 | 只看该作者
写程序时时刻刻注意自己的变量范围。

使用特权

评论回复
10
ayb_ice| | 2013-1-18 08:39 | 只看该作者
这是基本功,比较容易处理,
有时也比较隐藏,比如计算过程的中间值可能溢出,

使用特权

评论回复
11
还是坚信| | 2013-1-18 12:17 | 只看该作者
游子路过,学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

77

帖子

3

粉丝