比如有一个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; }