许多同学可能都知道java的基础数据范围以及是如何计算的
一个byte占8个比特位故一整个byte应该是可以表示2^8次方的数也就是256个数
书本上给的范围是-128 ~127也确实是占据了256个数
但不晓得大家有没有思考过为什么偏偏是-128~127 而不是 -127~128
想要理解这范围的划分,我们要先知道计算机至存储的二进制方式是补码。
这里简单提一下 原码 反码 补码的概念
byte类型占8个比特位,第一个位为符号位,剩下的表示数据。
当这个数为正数时 它的原码第一个符号位为0
当这个数为负数时 它的原码第一个符号位为1
正数的原码 反码 补码都一样
如:10(假设为byte型类型)的原码、反码、补码都为 0000 10010
而负数的反码和补码就要由原码推导出来。
具体规则为 反码由原码所有位取反得到,补码由反码加1得到。
如: -5 的原码为 1000 0101 (假设这个-5为byte类型,byte类型为一个字节占8个比特位)
那么-5的原码先转换为反码 那么反码顾名思义它的所有位(除了第一个符号位)都取反(0变1,1变0) 得到5的反码为1111 1010
再把5的反码加1得到5的补码 即 1111 1011
如此大家可以轻松知道正数的补码最大也就是到0111 1111 也就是127
然后发现好像-128的补码好像溢出了
-127的补码为1000 0001
那么-128的补码应该为-127补码再减去1 得到1000 0000
实际上大家可能会发现0实际上会有 +0 (0000 0000)和-0 (1000 0000)
这里也可以看做是把-0的二进制值拿来表示了-128