为什么8位有符号数的取值范围是-128~+127

首先我们知道,计算机以补码的形式存储的,正数的补码是原码不变,负数的补码是原码的取反加1。

我们先来看+127,原码0111 1111对吧,若+128是多少呢,0111 1111 + 1 = 1000 0000 (原码),然后存储时,计算机一看是最高位为1,就保持符号位不变,后面7位取反加1,然后呢,进位舍弃,还是1000 0000(-128)。所以对于8位数据来说,+128 实际上变成 - 128。


对于-128我们来看,首先对于负数,计算机处理是保持符号位不变,剩余位先取绝对值然后取反加1,128(取绝对值)1000 0000 取反(1111 1111),加1 (1000 0000),所以-128的补码是1000 0000(原码和补码一样的),下面,我们来看一下-129的值,-128的原码为 1000 0000 减1 等于0111 1111 (原码计算就没有那些规矩了,直接计算就行了),然后存储,计算机一看正数,就直接存储了+127.


strlen()函数是返回一个字符串的长度,遇到'\0'结束。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个字节有8位二进制位,理论上可以储存的量为 2^8 即256。由于字需要进行相应的运算(+ - * / …),所以我们希望256个里面能够包含相应的负,然而二进制本身没有表示负。所以,规定字节的第一个位是符号位,并且0表示正,1表示负。这样一来,正就能表示 2^7 即 127 ~ 0 之间的,负则能表示 - 2^7 即 -127 ~ 0 之间的字。这就对于0的存储出现了重复, “+0” 即00000000 和 “-0” 即10000000。逻辑上来说 “+0” 和 “-0”同时存在,显然不合理,存储上来说 “+0” 和 “-0” 表示一个但是占用了两个存储位,也不合理。既然0重复不合理,那么是否可以只保留一种作为0的表示,另外一种作为其他的表示呢?如果可以的话,不就解决了逻辑上和存储上的问题了吗?那么到底是保留 “+0” 还是 保留 “-0” 呢?去除掉的那个“0”又表示什么呢?当前一个字节已经可以保存 127 ~ -127 (0重复) 即255个。对于额外保存的,我们当然是希望保存这个范围之外的,并且最好“接壤” 127 ~ -127这个范围,那么优先考虑 128 和 -128。我们知道,字节的存储其实是使用补码来表示的,-127的补码是 10000001,这个字 减1 刚好是 “-0” 10000000,-127 减1 等于 -128,所以这里将 “-0” 10000000 表示 -128 最合适。所以,最后一字节的表示范围就是 127 ~ -128 (256个)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值