java中byte类型的数据,存储在计算机内存中占1个字节(即0或者1表示的8位二进制数),数据在计算机中都是按照补码形式表现,因此首先了解一下原码、反码、补码的基本概念。
一、原码、反码和补码的对应关系
带符号的数据二进制表示的形式最高位代表符号类型,其中,0表示正数,1表示负数。
对于正整数而言,原码、反码和补码是相同的,比如127
符号位 数值位
原码表示为: 0 1111111
反码表示为: 0 1111111
补码表示为: 0 1111111
即127在计算机中表示为01111111
对于负整数而言,反码表示为原码的最高位不变,其他位反转(就是0变为1,1变为0),补码表示反码加1。比如-127
符号位 数值位
原码表示为: 1 1111111
反码表示为: 1 0000000
补码表示为: 1 0000001
即-127在计算机中表示为10000001
二、最大范围和最小范围的计算
(1)最大范围
这个比较简单就是计算01111111的十进制数,通过二进制计算十进制:
max = (2^0+2^1+2^2+...+2^6),
很容易看出这是一个等比数列,通过等比数列求和公式计算为:
max=2^0(1-2^7)/1-2=2^7-1=127
(2)最小范围
对于正整数0,二进制表示为00000000
对于负整数-0,二进制表示为100000000(补码) 10000000(原码)
由于正整数0和负整数-0相等,但是它们的二进制表示形式却不一样并且-0还是9位二进制表示的,所以为了解决这个问题,就让10000000表示为-128即
min=-128
(3)总结
每个数据都是由8位二进制表示,每一位都有2种可能(0或者1),所以8位二进制可以组合的数据个数为:
sum = 2^8=256
根据(2)中分析,正整数从0~127共sum1=128个,负整数从-1~-128共sum2=128个
sum1 + sum2 =sum即从这个角度也可以说明最小范围为-128,最大范围为127。