问:为什么有符号的char可表示范围是-128~+127?
要明白这个问题,首先要明白一下几点:
对于char和int计算机中以补码形式存在。
严格来说计算机就是傻逼,它只知道某个位上是0还是1。
我们人为告诉计算机一个规则:要是这8个位最高位是0,那么你这8个位中存储的是一个正数;要是这8个位最高位是1,那么你这8个位中存储的就是一个负数。
我们又告诉计算机一个规则:你这个傻逼,你里面存储的补码是个什么东西,我看不懂,你要人性化一点,把这个东西给我弄成源码,要是用十进制显示出来那最好了,于是你告诉了计算机如何将这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
原文:http://www.cnblogs.com/luojialin/p/4764745.html