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