为什么 1 字节表示的数值范围是 127 ~ -128

问题

  为什么 1 字节表示的数值范围是 127 ~ -128?


一、基本单位

  bit (比特):
  表示二进制位,位是计算机内部数据储存的最小单位。一个二进制位可以表
  示0, 1两种状态,两个二进制位可以表示00, 01, 10, 11四种状态 …
  byte (B, 字节):
  八个二进制位(bit)为一子节(byte),字节是计算机中数据处理的基本单位。
  一个字节数通常有三种表示,即原码, 反码和补码。
  kilobyte (KB):
  十进制中,通常将原单位的1000倍作为下一个数量级单位,二进制中
  2^10 即1024最接近1000,所以将1024B最为下一个单位KB。
  megabyte (MB):
  1024KB
  gigabyte (GB):
  1024MB
  …
  

二、原反补码

正整数 :
原反补码相同,都是正整数的二进制表示
  负整数 :
  原码 :
  数值的二进制
  反码:
  原码各个位取反
  补码:
  反码的基础上加1

// TODO 补充一下原反补

 

三、问题分析

 
  首先,一个字节有8位二进制位,理论上可以储存的数量为 2^8 即256。由于数字需要进行相应的运算(+ - * / …),所以我们希望256个数里面能够包含相应的负数,然而二进制本身没有表示负数
 
  所以,规定字节的第一个位是符号位,并且0表示正数,1表示负数。比如001001011表示正数,110100011表示负数。
 
  这样一来,正数就能表示 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个数)。另外,像KB, MB, GB…都类似于这种存储方式。


  • 18
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值