比如有一个short a; 我们有时候会给前面加上一个unsigned ,就变成了unsigned short a;
这个时候呢,因为short是16位,16位能表示出65536种数字。如果是short a;他的范围就是-32768 ~ +32767。加上signed也是一样的,如果加上unsigned呢,他的范围就变成了0 ~ 65535 了。
ps:unsigned 本身是 unsigned int 的缩写。
例如short a; 这里a的范围是-32768 ~ +32767
而unsigned b; 这里b的范围是0 ~ +65535
用一个表格来说明:
short a(以下是a的取值) | a-1 | a+1 |
0 | -1 | 1 |
-32768 | 32767 | -32767 |
32767 | 32766 | -32768 |
a的取值范围 | -32768 ~ +32767 | |
| ||
unsigned b(以下是b的取值) | b-1 | b+1 |
0 | 65535 | 1 |
1 | 0 | 2 |
65535 | 65534 | 0 |
b的取值范围 | 0 ~ 65535 |
上代码,注释有解释:
#include <iostream>
#define ZERO 0 //make ZERO symbol for 0 value 。定义ZERO为0??(是这样么?)
#include <climits> //define INT_MAX as largest int value .规定INT_MAX 成为int的最大值
int main()
{
using namespace std;
short sam = SHRT_MAX; //initialize a varible to max value 。初始化一个变量,让他是最大值。这里初始化sam(后面代表Sam的金钱)是16位字符能表现的最大数字。
//因为short(非无符号类型)的范围是-32768~+32767之间,因此他的最大值是32767.
unsigned short sue = sam; //okay if varible sam already defined。 这里将sam的值赋值给sue(后面代表Sue的金钱)是无符号类型的short(其取值范围是0~65535)。
//而sam的值32768在unsigned short范围内,因此sam和sue都是32767
cout << "Sam has " << sam << " dollars and Sue has " << sue; //因为上文,所以两个值都是32767
cout << " dollars deposited." << endl //换行
<< "Add $1 to each accout." << endl << "Now"; //告诉你,两个都要加1了
sam = sam + 1; //注意这里,因为sam是short的最大值,他加1所以就超过了short的取值范围。
sue = sue + 1; //由于sue尚不是unsigned的最大值,所以+1仅仅只是数字加1罢了。
cout <<"Sam has "<<sam << " dollars and Sue has " << sue; //sam因为超出了范围,所以自动循环到其取值范围的最小,即-32768。而sue正常,所以为+32768.
cout << " dollars deposited.\nPoor Sam!" << endl; //这一段结束了,再次换行。
sam = ZERO; //上面的#define ZERO 0应该是定义ZERO为数值0的意思吧?所以sam和sue都等于0了
sue = ZERO; //如上
cout << "Sam has " << sam << " dollars and Sue has " << sue; //显示出 sam和sue都是0。需要注意的是,sam的最小值不是0,而sue的最小值是0
cout << " dollars deposited." << endl;
cout << "Take $1 from each account." << endl << "Now "; //本段结束,告诉你,下一段,sam和sue都将减一
sam = sam - 1; //sam和sue分别减一
sue = sue - 1;
cout << "Sam has " << sam << " dollars and Sue has " << sue; //由于sam的最小值不是0,因此-1后是-1.而sue的最小值是0,-1后循环到最大值,即65535
cout << " dollars deposited." << endl << "Luck Sue!" << endl;
system("pause");
return 0;
}