C语言
2015-11-13 14:35
232 查看
随笔- 2 文章- 0 评论- 0
C语言之整形溢出
c语言中存在两种整形算术运算,有符号运算与无符号运算。在无符号算数运算中,没有所谓的“溢出”一说:所有的无符号运算都是以2的n次方为模,这里的n是结果中的位数。如果算数运算符的一个操作数是有符号整数,另一个是无符号整数,那么有符号整数会被转换为无符号整数,”溢出“也不可能发生。但是,当两个操作数都是有符号的整数时,”溢出“就有可能发生,而且”溢出的结果是未定义的。当一个运算的结果发生”溢出“是,做出任何假设都是不安全的。
例如,假定a和b是两个非负整形变量,我们需要检查a+b是否会”溢出“。一种想当然的方式是这样:
if(a+b<0)
complain();
这并不能正常运行。当a+b确实发生”溢出“时,所有关于结果如何的假设都不再可靠。例如,在某些机器上,加法运算将设置一个内部寄存器为四种状态之一:正、负、零、和溢出。在这种机器上,c编译器完全有理由来实现上面的例子,即a与b相加,然后检查该内部寄存器的标志是否为”负“。当加法操作发生”溢出“时,这个内部寄存器的状态是溢出而不是负,那么if的语句的检查就会失败。
一种正确的方式是将a和b都强制转换为无符号整数:
if((unsigned)a+(unsigned)b>INT_MAX)
complain();
INT_MAX为定义的最大常量
相关文章推荐
- C语言传递数组到函数的一个发现
- C语言中交换两个变量的值
- c语言006-sizeof/strlen的使用和区别
- 【C语言】冒泡排序与回文判断
- c语言之内联inline
- C语言 函数默认参数
- C语言中类型转换问题
- C语言的基本文件操作
- C语言编译过程
- C语言获取编译器时间(keil5 MDK)
- C语言pow()函数:求x的y次方(次幂)
- C语言带颜色的printf/fprintf打印
- 数据结构 线性表顺序存储 顺序表 C语言
- C语言 API
- linux用C语言读取网卡MAC地址
- 山东理工大学ACM平台题答案关于C语言 1184 C语言实验——拍皮球
- c语言全局变量和局部变量问题汇总
- c语言的一些算法函数
- C语言面试题集锦
- C语言使用注意事项(二)