将一个负数赋值给一个无符号数会出现什么情况呢

在正文开始之前,我们先看一下下面这段看似简单的代码:

    #include 
    #include
    int main()
    {
    char a = -1;
    signed char b = -1;
    unsigned char c = -1;
    printf("a=%d,b=%d,c=%d", a, b, c);
    system("pause");
    return 0;
    }

那么这段代码的输出结果是什么呢?
答案是:
-1
-1
255

关于上面的代码,首先我们要说的缺省情况下的char内心是有符号的,所以第一条赋值语句和第二条赋值语句等效。

而对于第三条代码,我们将一个负数赋值给了一个无符号数,想想为什么会得到255这样的结果?

首先,对于-1,对于这个数来说,它本身是一个负数,我们知道在计算机中,所有内容的存储都是以二进制形式存储的,而且是以补码形式存储的。因此,对于这里的问题,我们需要分析下这个转变的过程。

以一个字节为例说明
-1的原码是:
10000001
反码:
11111110
补码:
11111111

好,我们现在再来看这个问题,计算机中存储了-1的补码,也就是11111111,这时候,我们将它赋值给了变量c,而c是无符号的,那么11111111就会被直接当做无符号数来转换,对于无符号数来说11111111的十进制表示就是255。所以这就是为什么最后会得到255的结果。

你可能感兴趣的:(C++)