直接给总结:计算机规定了0000 0000 代表0,1000 0000代表的-0没有意义,必须找个~127~127之外的数和它对应,「人为规定-0就是-128」,而且这么做完美适合计算机做减法运算。


来我们一步步分析分析:

1.byte占用8位,每位用0或1表示,能够表示256(2^8)个数据。

2.这8位分为符号位(最高位)和数值位(剩余七位),符号位0表示正数,1表示负数。

3.按上一步的理解,容易得到(+127:0111 1111、+1:0000 0001、+0:0000 0000、-0:1000 0000、-1:1000 0001、-127:1111 1111),计算机底层定义了+0(0000 0000)就是0,那么“可怜的-0”又该何去何从呢?计算机遇到这个二进制该如何处理呢?总不能把这两个都对应0吧,这显然是资源浪费。

4.到这里我们都认为最高位是不参与计算数值的,仅仅是一个符号位,按这种思路byte的八位是无论如何也表示不出-128。而“可怜的-0”又不知道自己代表谁,不得而知“可怜的-0”就是-128。(为什么呢?凭什么呢?你说代表-128就代表-128呀!为什么不能是+128、-250、+250.......)。

5.到这里我们已经很粗浅地回答了-128~127中的-128的由来,基本也回答了这个题目。


6.可是然而但是——对于程序员来说,上诉的分析【首先】是结论正确,但是过程错了。错误在于——负数的二进制表示是错误的,比如-127:1111 1111,这是不对的。计算机发现了1111 1111会把它认为是-1而不是-127。【其次】没有解释为什么-0最后表示成-128。

7.计算机基础知识普及:原码、反码、补码
        <1>计算机存储有符号的整数是都是存储它们的补码。Java语言都是有符号位的。
        <2>正数和0的补码、反码是本身原码;所以对于正数来说,可以理解为不存在反码和补码。
        <3>负数的反码是是符号位不变,其它位取反;补码是在负数的基础上加1(符号位不变)。负数就是矫情啊!
        <4>计算机中用补码进行加法运算。

8.接着从人的思考方式理解下当计算机处理1111 1111的过程,首位是1,自然是负数,而且这是补码,那么对应的原码就是,先减1,变成1111 1110,符号位不变,其他取反,变成1000 0001,也就是-1!所以从10000001到11111111依次表示-127到-1。。对之前的分析过程是不是很打脸?。

9.最后来解决这个-128为什么可以用1000 0000表示。
   这里我分析的是byte,它就8位。在无符号位的二进制中128的表示为1000 0000。有符号位的情况下byte好像无法表示+128或-128。
   如果我们假设现在byte不是占用8位,而是9位,最高位是符号位。那么-128就能够是1 1000 0000,其补码也是1 1000 0000,很神奇吧,一样的。-128的补码尾八位就是1000 0000。那就规定【1000 0000是-128的补码,且-128是没有原码和反码的,即不能利用1000 0000反推其原码和反码】。

10.如果你对9步的推导表示不太接受,那么简单就认为计算机规定了1000 0000就是-128,是一种人为设计没有什么道理可以言(据说是印度阿三设计的)。其实这么设计也是很巧妙的,在于:
    【其一】对于如果大于8位的有符号整数数据类型,-128的补码尾八位刚好是1000 0000。
    【其二】比如127(0111 1111)加1(0000 0001)刚好得到-128(1000 0000),-128(1000 0000)加1(0000 00001)等于-127(1000 0001)这样从-128~127的反码首尾相连,形成了一个闭环,就像时钟一样。   
    【其三】在计算机中减法运算可以转换成加法运算,比如8-1——>8+(-1)——>补码运算:(0000 1000) + (1111 1111) = (0000 0111) 刚好是7。-128+127——>(1000 0000) + (0111 1111) = (1111 1111)刚好是-1,-128的补码完美的适用于减法。


结论:
    【1】计算机中负数是用补码的形式保存、并用它参与加减法运算的,减法会被转换为加法,计算机中没有加法运算。
    【2】反码是为了解决减法运算,补码是为了解决反码产生的±0的问题。参考(https://blog.csdn.net/boatalways/article/details/17027573)
    【3】对人而言二进制所代表的值一定是从原码求出的,开头如果是1的二进制,一定要说明其实原码、反码还是补码。
    【4】在原码、反码、补码相互转换以及求对应的十进制求值时,符号位是绝不参与的,但是在加减过程中,是参与位运算的。
    【5】计算机中规定了-0对应的二进制就是0,那么-0就没有意义了,必须找一个数和它对应。
    【6】byte的最小值-128、short的最小值-32768、int的最小值-2147483648都是用对应的-0的原码来进行表示,这是人为规定的、人为规定的、人为规定的。但是这么规定又很巧妙,妙在上述10中的三点。


【秒懂】byte的取值范围为什么是-128~127?相关推荐

  1. byte的取值范围为啥是[-128~127](超详细教学,建议收藏)

    今天收到铁子问了一个问题,在java中的byte的取值范围为啥是[-128,127],而不是[-127,127];于是针对这个问题继续水一篇博客: 一.解释为啥会提出[-127,127]的问题 在字节 ...

  2. 关于进制补码的八位取值范围为什么是-128~127和补码-128的求取

    我们求补时不能按照平常的求补码方法来求,如果这样求的话,只会把自己碰的头破血流,所以我们不能将自己的思维固定在原码转反码转补码之上,这样最后求出来的是出问题的. 可以这样,我们将在-128~127里面 ...

  3. byte的取值范围-128~127原理

    我们都知道byte为8位二进制数据,最高应该是11111111,为255(10进制).但是为什么byte的取值范围为-128~127呢? 因为不管是Int类型还是byte类型,当用二进制定义整数时候, ...

  4. java中 byte 取值范围_【二进制基础-java中byte的取值范围-推导过程】

    java中用补码表示二进制数,补码的最高位是符号位,最高位为"0"表示正数,最高位为"1"表示负数. 正数补码为其本身: 负数补码为其绝对值各位取反加1: 例如 ...

  5. java中 byte 取值范围_java中为什么byte的取值范围是-128到+127

    概念:java中用补码表示二进制数,补码的最高位是符号位,最高位为"0"表示正数,最高位为"1"表示负数. 正数补码为其本身: 负数补码为其绝对值各位取反加1: ...

  6. Java的byte类型取值范围为什么是负128到正127呢

    Java的byte类型取值范围是-128~127为什么负数是128正数到127呢 概念:java中用补码表示二进制数,补码的最高位是符号位,最高位为"0"表示正数,最高位为&quo ...

  7. c语言中char的取值扩大,C语言中 char 类型的取值范围为什么是-128~127

    我们之前已经说过关于原码.反码和补码的一些东西,如果你没有看过,可以点这里< 你知道原码.反码和补码吗,进来了解一下吧 >看一下 . 好了,可能你不会太想看,所以我们一起再来简单的复习一下 ...

  8. Byte的取值范围是-128-127

    Byte 占1个字节=8比特 最高位(最左边)为符号位 0表示正数:1表示负数 正数: 最大值(01111111) 最小值(00000000) 负数: 最大值(11111111) 最小值(100000 ...

  9. byte的取值范围、8种基本类型范围

    参考:https://www.cnblogs.com/tuojunjie/p/6383624.html Java中用补码表示二进制数,补码的最高位是符号位,最高位为"0"表示正数, ...

最新文章

  1. React-native 官方 demo
  2. Kali Linux 安全渗透教程第三更1.2 安全渗透所需工具
  3. go语言中使用递归函数实现文件目录的遍历
  4. SAP Spartacus 在 Github 托管虚拟机上执行的 pipeline 明细
  5. csdn个人主页下如何添加微信公众号及超链接
  6. struts2 防止重复提交 与 进入等待画面
  7. html5圆圈刷新 博客,html5话出带圆的波浪线
  8. arttemplate模板引擎里面多层循环
  9. linux 防火墙检查
  10. 大数据之Hadoop图解概述
  11. Excel_使用条件格式制作甘特图
  12. 【IIOT】欧姆龙PLC数采之CP2E
  13. 量子计算机epr,从EPR到量子信息[转] - 物理 - 小木虫 - 学术 科研 互动社区
  14. JNPF 3.1升3.2新版本内,拉姆达表达式内时间比较
  15. jdk8 list 反转_三相异步电动机正反转故障排除在实训教学中的应用
  16. xml文件格式化脚本
  17. APK保护技术——保护应用、游戏APP不被破解
  18. 安装splash与启动
  19. [笨木头FireFly01]入门篇1·最简单的服务端和客户端连接
  20. Python编程:实现词云生成(附详细源码)

热门文章

  1. 周小川最新演讲:Libra可能会导致“赢者通吃”的局面(万字长文)
  2. 微信公众号开启付费阅读
  3. windows关闭端口命令cmd
  4. Java定时任务(2)
  5. 同步和异步,阻塞非阻塞IO
  6. 古希腊神话故事7 :卡德摩斯
  7. 利用java实现可视化界面肯德基(KFC)点餐系统
  8. 如何有效地开展头脑风暴
  9. 域名能用来干什么?为什么有人愿意花这么多钱买域名?
  10. mysql数据库中常用的类型_MySQL数据库中常用字段类型