算术运算的溢出行为 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();
posted on 2010-05-28 17:36  ︶ㄣ第二名  阅读(1181)  评论(0编辑  收藏  举报