(二十六)符号类型

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

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值