zoukankan      html  css  js  c++  java
  • 算术运算的溢出行为 and 一个数内存中表示1的个数

    #include <iostream>
    using namespace std;
    
    int numOnesInBinary(int num)    //统计一个数在内存中表示形式,有几个1
    {
        int numOnes = 0;
        while(num != 0){
            num = num & num - 1;
            numOnes++;
        }
        return numOnes;
    }
    
    void main()
    {
        {
            int a = -1;
            unsigned int b = 2;
            cout << (unsigned int)a << endl;
            cout << a + b << endl;
            a = -3;
            //【此处有疑问】
            cout << a + b << endl;    //得到结果为unsigned int
        }
    
        {
            short a = -1;
            unsigned short b = 2;
            cout << (unsigned short)a << endl;
            cout << a + b << endl;
            a = -3;
            //【此处有疑问】
            //此处输入为啥和上面代码为int时输出不一致?
            cout << a + b << endl;    //为啥不得65535?a+b之后的结果不是无符号数吗?
        }
    
        int a1 = -1;
        int a2 = 88;
        cout << (a1 & a2) << endl;    //按照内存中的表示形式按位与,-1内存表示为32个1
    
        int ival = -1;
        cout << "The num of 1 in momory is: " << numOnesInBinary(ival) << endl;
    
        {    //无符号数算术运算无溢出一说
            unsigned short b1 = 65530;
            unsigned short b2 = 5000;
            cout << "b1 + b2 = " << b1 + b2 << endl;
        }
        {    //计算加法时,有符号先被提升为无符号short,所以没有溢出一说
            unsigned short b1 = 65530;
            short b2 = 5000;
            cout << "b1 + b2 = " << b1 + b2 << endl;
        }
        {    //溢出
            short b1 = 65530;
            short b2 = 5000;
            cout << "b1 + b2 = " << b1 + b2 << endl;
        }
        getchar();
    }

    捕获

    说明:

    1)函数numOnesInBinary采用的方法对正负数通用。

    2)【此处有疑问】 处,本人不理解,无符号数和有符号数算术运算得出的结果应该为无符号数,为何有一个输出-1呢?哪位高手碰巧看到此文,请赐教。

    3)&按位与,即按内存中的表示形式按位与。任何数与-1按位与,结果是本身。

    算术运算的溢出问题:

         C语言中存在两类整数算术运算,有符号运算和无符号运算。

         在无符号算术运算中,没有所谓的“溢出”一说:所有的无符号运算都是以2的n次方为模,这里n是结果中的位数。

         如果算术运算的一个操作数是有符号整数,另一个是无符号整数,那么有符号整数在运算前被转换为无符号整数,“溢出”也不可能发生。

         当两个操作数都是有符号整数,“溢出”就可能发生。

    例子

         假定a和b是两个非负整数变量,如何检查a+b是否溢出呢?

    if(a + b < 0)    //error
        complain();
    if((unsigned)a + (unsigned)b > INT_MAX)    //OK, INT_MAX在?<limits.h>
        complain();
    if(a > INT_MAX - b)    //OK
        complain();
  • 相关阅读:
    【Unity3D】使用MD5值,确保本地Sqlite数据库内容没有被篡改
    《Unity3D》通过对象池模式,管理场景中的元素
    NGUI制作 《九宫格》 图片
    NGUI混合FingerGesture《卷二》分离触摸事件
    js的各种获取大小
    sass基础
    js面向对象开发基础
    正则表达式(进阶篇)
    正则表达式(基础篇)
    jquery源码学习(三)—— jquery.prototype主要属性和方法
  • 原文地址:https://www.cnblogs.com/younes/p/1746521.html
Copyright © 2011-2022 走看看