一 基础知识
在讲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个数,(如果上面理解不了, 请看下图)。
接下来我们按照数递减原则来解决问题
- 正数的最大值应该是 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!!!
由此其他类型的范围也可推出。
标签:反码,补码,1111,127,128,0000,byte,原码 From: https://www.cnblogs.com/javaxubo/p/17499051.html