#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();