在正文开始之前,我们先看一下下面这段看似简单的代码:
#include <stdio.h>
#include<Windows.h>
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的结果。