有关unsigned和有符号类型的区别
相信大家对于unsigned这个玩意并不陌生,但是有的时候却会被它搞懵,比如下面:
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
int main(int argc,char *argv[])
{
char a = 255;
char b = 256;
unsigned char c = 255;
unsigned char d = 256;
cout << (int)a << endl;
cout << (int)b << endl;
cout << (int)c << endl;
cout << (int)d << endl;
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
对于这个问题,我的理解是:unsigned和普通有符号类型我们都可以将其看做是一个钟表,以char为例,如下所示:
如上面的代码所示,从0-127是不改变的,然后实际上128 = -128,129 = -127又依次循环到256 = 0,这就能解释为什么255 = -1了。实际上unsigned和有符号的区别就在于大于128之后的部分。
和无符号类型的相似,在128之后不是从-128再次开始,而是一直到256就归0了,然后再继续,所以相当于unsigned就将同类型的无符号类型的扩大了一倍。
对于类型选择问题,有下面三个原则:
1:要是确定是无符号类型就用unsigned。
2:要是int类型大小不够,就用long long,因为int一般和long是一样大的。
3:要是考虑到精度的问题,能用double的就用double不用float。
相信大家对于unsigned这个玩意并不陌生,但是有的时候却会被它搞懵,比如下面:
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
int main(int argc,char *argv[])
{
char a = 255;
char b = 256;
unsigned char c = 255;
unsigned char d = 256;
cout << (int)a << endl;
cout << (int)b << endl;
cout << (int)c << endl;
cout << (int)d << endl;
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
对于这个问题,我的理解是:unsigned和普通有符号类型我们都可以将其看做是一个钟表,以char为例,如下所示:
如上面的代码所示,从0-127是不改变的,然后实际上128 = -128,129 = -127又依次循环到256 = 0,这就能解释为什么255 = -1了。实际上unsigned和有符号的区别就在于大于128之后的部分。
和无符号类型的相似,在128之后不是从-128再次开始,而是一直到256就归0了,然后再继续,所以相当于unsigned就将同类型的无符号类型的扩大了一倍。
对于类型选择问题,有下面三个原则:
1:要是确定是无符号类型就用unsigned。
2:要是int类型大小不够,就用long long,因为int一般和long是一样大的。
3:要是考虑到精度的问题,能用double的就用double不用float。