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();
  • 相关阅读:
    inux按照CPU、内存、磁盘IO、网络性能监测
    监控数据库
    NMON监控工具
    AJAX
    性能经验之谈【转】
    内存/硬盘/io关系
    testng中添加案例失败重试次数
    如何使用beanshell写入数据到文件(txt、csv)
    Docker 容器中配置nginx后报403 Forbidden 解决办法
    Centos7创建支持ssh服务器的docker容器
  • 原文地址:https://www.cnblogs.com/younes/p/1746521.html
Copyright © 2011-2022 走看看