今天去了一家游戏公司笔试,其中有一题引起我的注意。
int a = -1;
unsigned int b = 2;
unsigned short c = 3;
cout<<(a<b)<<endl;
cout<<(a<c)<<endl;
cout<<(b<c)<<endl;
然后就是问你输出什么及其理由。
然后我回来之后就是敲代码验证。事实说明我是才对了。
根据我搜回来的资料显示,int和usigned int想加减的话,会先同意转换成unsigned int再进行运行。先看看(a<b),根据上面分析,它首先会转换成无符号数,也就是很大很大的数。
然后就是unsigned short 和int 的运算了。资料显示是会转换成int,然后再运算。所以a<c是必然的。
关键点来了,unsigned int 和unsigned short 怎么办?很简单,就是变为前者咯。不过这里值得注意就是,b<c是成立的。毕竟2小于3.但是b-c就大于0了。这就是由无符号造成的。
不要问我怎么知道两个数怎么转换。我不会告诉你我有个小办法的。
cout<<typeid(a).name()<<endl; //就会输出a的类型。 如 int
通过上面的小测试,我总结了一下两点。
1. 同类型的变量,会倾向于无符号。(int ---> unsigned)
2. 不同类型的变量。会倾向于范围比较大的那位。(unsigned short---->>>int),位小的会补位。
上面的又可以总结为一条:向大的倾向。(有符号比无符号最大范围大一倍嘛,哈哈)。
----------------------------the end------------------------------------------