解读为什么有符号的char可表示范围是-128~+127

时间:2023-03-09 02:33:29
解读为什么有符号的char可表示范围是-128~+127

问:为什么有符号的char可表示范围是-128~+127?

要明白这个问题,首先要明白一下几点:

  1. 对于char和int计算机中以补码形式存在。

  2. 严格来说计算机就是傻逼,它只知道某个位上是0还是1。

  3. 我们人为告诉计算机一个规则:要是这8个位最高位是0,那么你这8个位中存储的是一个正数;要是这8个位最高位是1,那么你这8个位中存储的就是一个负数。

  4. 我们又告诉计算机一个规则:你这个傻逼,你里面存储的补码是个什么东西,我看不懂,你要人性化一点,把这个东西给我弄成源码,要是用十进制显示出来那最好了,于是你告诉了计算机如何将这8个位上表示的数转化成你想要的结果:如果你这8位存储的是个正数,那么源码和补码是一样的,你把你这8个位中存储的东西按照2进制转化10进制转化就好了,要是你这8位存储的是一个负数,那你需要给这8位数加上1,然后求反,就是源码,再转化成10进制就好了。

当计算机知道了这些规则后就可以完美转化了,那我们看看计算机是如何转化的:

首先计算机中的8位变化范围是:

计算机中的补码    我们转化后的原码    我们从原码得到的十进制数    实际表示的十进制

0000 0000          0000 0000              0                                            0

.....                        ....                           ....                                            ....

0111 1111          0111 1111              127                                        127

1000 0000          1000 0000              128                                       -128

....                         ....                            .....                                          ......

1111 1111           0000 0001              1                                           -1

看到那个128怎么一下变成了-128,还有那个1怎么一下子变成了-1,再回去看看第三条规则就知道,计算机已经知道它这8位里面存储的是一个负数,不要给自己强加那个符号位的概念,那是给计算机的一个识别标志,计算机由这个识别标示知道它里面存储的是正数还是负数,并不影响我们使用这个位上的值,所以我们计算出来的这个128,它是个负的,故由上面的推导可以看出范围是-128到127

关于补码的两个练习题:

问main函数最后的输出结果是?

 int main(void)
{
char a[];
int i=;
for(i=;i<;i++)
{
a[i]=--i;
}
printf("%d\n",strlen(a));
return ;
}

结果是:255

问foo函数输出结果是多少?

 void foo()
{
unsigned int a=;
int b=-;
(a+b)>?puts(">6"):puts("<=6");
printf("%u\n",a+b);
}

结果是 >6