有关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;
}

这里写图片描述

对于这个问题,我的理解是: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

posted on 2016-01-22 18:32  杨博东的博客  阅读(43)  评论(0编辑  收藏  举报

导航