zoukankan      html  css  js  c++  java
  • 程序员---C语言细节7(增加两个整数溢出检测)

    主要内容:增加两个整数溢出检测

    #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
    ");
    	  
        错误原因:在某些机器上。加法运算将设置内部寄存器为四种状态正、负、零和溢出。
    	在这样的机器上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
    ");
     	 }
    #else
    	/*
    	法二、 
    	*/ 
    	if(a > INT_MAX - b)    // 写成这个形式就能够不用(unsigned)了 
    	{
    		printf("overflow
    ");
    	}
    #endif 	 
    	return 0;
    }

    输出:


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    C# 哈希表
    C# 连接SQL Server数据库的连接字符串<转>
    C# ADO.NET中的五个主要对象<转>
    C# integrated security=SSPI<转>
    C# ADO.NET访问SQL Server数据库<转>
    C# .NET 页面间传值的几种方法<转>
    C# Datatable删除行的Delete和Remove方法
    C# DataTable转json
    CSP2019 爆炸记
    停更通知
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4876514.html
Copyright © 2011-2022 走看看