c语言编译为什么是127,解读为啥有符号的char可表示范围是-128~+127

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

问:为什么有符号的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 voidfoo()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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值