程序员---C语言细节7(增加两个整数溢出检测)
2015-10-14 09:41
302 查看
主要内容:增加两个整数溢出检测
#include <stdio.h> #include <limits.h> int main(int argc, char *argv[]) { /* * a和b为非负整型变量,检測a+b是否会“溢出” */ // INT_MAX=2147483647 int a=123456789,b=2147483000; /* 方法一: if(a+b < 0) printf("overflow\n"); 错误原因:在某些机器上。加法运算将设置内部寄存器为四种状态正、负、零和溢出。 在这样的机器上c编译器有理由这样来检測 。a与b相加,然后检查内部寄存器的相关标志是否 为负。然而当溢出发生时。内部寄存器状态是溢出而不是负,那么溢出检測就会失败 */ /* * 正确方法为: 法一、将a和b都强制转换成无符号整数;(原因:由于假设不转的话两个数,假设相加结果 是大于INT_MAX的话在放入32寄存器中时是有符号的,符号位被置1了。变成负数,这样就不可能 大于INT_MAX了,即检測不出来了) */ #if 1 if((unsigned)a + (unsigned)b > INT_MAX) // (unsigned)不可缺少,INT_MAX在limits.h中定义,假设没有则自己实现 { // INT_MAX=2147483647 printf("overflow\n"); } #else /* 法二、 */ if(a > INT_MAX - b) // 写成这个形式就能够不用(unsigned)了 { printf("overflow\n"); } #endif return 0; }
输出:
相关文章推荐
- C语言基础
- Longest Substring Without Repeating Characters - Leetcode
- [c++] LeetCode Two Sum问题
- 第一、二课C语言基础课程学习心得
- c++ include 与 using namespace
- Eclipse下编写C++程序——CDT环境搭建
- access函数使用方法
- 01背包问题的动态规划算法
- hdoj 2044 一只小蜜蜂... C++
- 运算符重载
- poco c++框架:日期时间
- 黑马程序员——C语言学习笔记06 结构体
- hdoj 2042 不容易系列之二 C++
- c++ 常量成员函数
- 初学ACM - 组合数学基础题目PKU 1833
- 关于C++中的类
- c++ primer第五版(中文)习题答案 第十章第四节第二小节-iostream迭代器
- leetcode笔记:Binary Tree Preorder Traversal
- C语言基础知识
- 从C++文件中读取数据到vector的简捷方法