之前在网上看到许多文章都在介绍:byte数据类型的范围是 -128 到 127 ,short数据类型的范围是 -32768 到 32767 ,还有int,long。。。。等等其他数据类型的取值范围。
我这个小白就很好奇,为什么byte的范围是 -128 到 127 ,因为二进制的数字既然只能用 0 和 1 来表示,那么在 1 个字节里,最大的数字应该是 11111111 ,也就是 255 啊?
但这跟byte里的最大数127差别有点大哈。
还有 -128 哪里来的,二进制还能表示负数?
我就去百度了解了符号位的概念。在一段1 字节 8 位数据中,最左边的数字为符号位,具有确定数据为正数还是负数的作用,不代表任何值。如果符号位是 0 ,则表示此数据为正数;如果符号位是 1 ,则表示此数据为负数。
也就是说, 11111111 的最左边符号位是 1 ,所以计算机认为 11111111 整体是个负数,除去符号位的数据在计算机里的数值 1111111 就等于 -127 而不是 255 。
这刷新了我一直以来对二进制的印象,敢情之前都白学了。
那在byte范围中,如果想取正数最大值,那首先最左位不能为 1 ,所以 1 字节 8 位数据中,最大的数字应该是 01111111 ,也就是 127 。
和byte范围正数最大值对上了。
这样再依次对应下来,就能够获得 -127 到 127 的数值。
但是还缺一个二进制 10000000 没有数值。
那么, 10000000 到底是多少呢?
按照 10000000 和 00000000 的对应关系, 10000000 应该是 负0呀。
那 10000000 真的就是 负0 吗?我们都知道, 0 没有正负值,所以只需要存在一个 0 就行了。在寸土寸金的计算机结构里,假设 10000000 和 00000000 都是 0 ,那这是对计算机资源的严重浪费。
所以就定义了 10000000 等于 -128 。
为什么要这样定义呢?
我们可以通过补一个符号位,把原来的 8 位提高到 9 位,计算方式也继续按照二进制的方式,获得更大的数字。这样 -128 用二进制表示就是 1 10000000 。
我们可以继续补充二进制位数,扩展到2字节16位即 10000000 10000000 ,这同样也表示 -128。
既然这样,那 10000000 就定义为 -128 好了。
同理,九位的 1 00000000 想得到数值,也可以往前添一个符号位,通过 11 00000000 得到 -256 ,再截断最前面的符号位,把 1 00000000 表示为 -256 而不是 -0 。
以此类推, 2 字节的short数据、 4 字节的int数据和 8 字节的long数据,也就能知道各对应的位数中符号位为 1 、其余位为 0 的值了。