关于byte的范围为什么是-128到127

发布时间 2023-06-23 13:30:28作者: 哩个啷个波

一 基础知识

在讲byte的范围前,先普及下在java中数据在计算机中的表示方法,数据在计算机中都是用二进制表示的,并且是用补码进行数据计算的。

先引入原码,反码,补码:

原码:原码是一种计算机中对数字的二进制定点表示方法,一般进制的最高位是符号位,1代表负号0代表正号。

原码举例:(对于十进制转换成二进制就不多说,自行解决)

15 对应的原码就是 0000 1111(0是代表正号)

-15 对应的原码就是 1000 1111 (从左至右第一个1代表负号)

反码:若数值是正数的情况下,其反码是跟原码一样的

若数值的负数的情况下,其反码是在原码的基础上,保证符号位不改变,其他位遵循0变1,1变0的原则。

反码举例: 15 对应的反码就是 0000 1111(与原码保持一致)

-15 对应的反码就是 1111 0000(符号位与原码一致,其他位遵循0变1,1变0原则)

补码:若为正数,其补码与原码保持一致;若为负数,其补码在相应的反码上+1;

补码举例 15 对应的补码就是 0111 1111(与原码保持一致)

  • -15 对应的补码就是 1111 0000
  • + 1
  • ------------------------
  • 对应的补码就是 1111 0001 (在反码的基础上加1)

由此得出结论正数的反码,补码都跟原码保持一致。

负数的反码就是在原码的基础上保持符号位不变,其他位遵循0变1,1变0原 则,其补码就是在反码的基础上+1;

计算过程:比如 -15 + (2)=-13在计算机里如何实现

分析 :要知道计算机计算都是要用补码,所以第一步转换成补码形式,用补码进行加减

  • 数 补码
  • -15 1111 0001
  • + 2 0000 0010
  • ----------------------
  • 1111 0011

但是要明白你刚刚得出的答案是补码形式,当计算机要要得出最终的十进制答案时,你就得把刚刚的补码再逆转换成原码形式,最后再从二进制原码形式转化成十进制

如 补码 1111 0011

反码 1111 0010

原码 1000 1101

数 -13

二 理解方式:关于byte的范围为什么是 -128——127?

有了上面的基础,我们来解决今天的问题,首先要知道byte是一个字节,一个字节是占8位, 如 _ _ _ _ _ _ _ _ ,在这8个位置上只能填0,1,我们根据排列组合的知识那么一共2^8=256种,也就是说byte能够表示的数据一共有256个数,根据基础知识中的二进制第一位是符号位,又因为正数补码和原码是一致的,所以正数最大值的补码 0111 1111,其代表的就是127,那么从127-1之间存在127个正数,加上0就是128个数,所以负数占一半,也就是128个数,(如果上面理解不了, 请看下图)。

接下来我们按照数递减原则来解决问题

  1. 正数的最大值应该是 0111 1111 127 (补码:再次提示计算机的数据都是以补码形式)
  • 0111 1110 126
  • 0111 1101 125
  • ..............................
  • 0000 0001 1
  • 0000 0000 0 (为了方便理解 我把0看成正数)

由上可知补码从0000 0000 到 0111 1111 中存在128个数字

0~127:128个数

接下来负数从大到小最大值是 -1 对应的原码 1000 0001

反码 1111 1110

补码 1111 1111

补码

  • 则负数从大到小的补码从大到小顺序排列如
  • - 1 1111 1111
  • -2 1111 1110
  • -3 1111 1101
  • ................
  • -127 1000 0001
  • -128 1000 0000 这数补码实际是-0的补码

-128— -1(共128个数) (这里是关键,0和-0不是同一个数,也就是说-0的补码用来表示-128了,-0的补码"10000000"通过逆向计算刚好得到-128这个值)

正数和0一共128个 负数128个 刚好满足2^8=256个数

所以byte的范围是 -128——127!!!

由此其他类型的范围也可推出。