码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-27 22:49:08      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

问:为什么有符号的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函数最后的输出结果是?

 1 int main(void)
 2 {
 3     char a[1000];
 4     int i=0;
 5     for(i=0;i<1000;i++)
 6     {
 7         a[i]=-1-i;
 8     }
 9     printf("%d\n",strlen(a));
10     return 0;
11 }

结果是:255

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

1 void foo()
2 {
3     unsigned int a=6;
4     int b=-20;
5     (a+b)>6?puts(">6"):puts("<=6");
6     printf("%u\n",a+b);
7 }

结果是 >6

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

标签:

原文地址:http://www.cnblogs.com/luojialin/p/4764745.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!