大白话理解Java:数据类型范围与二进制

之前在网上看到许多文章都在介绍: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 好了。

同理,九位的 00000000 想得到数值,也可以往前添一个符号位,通过 11 00000000 得到 -256 ,再截断最前面的符号位,把 1 00000000 表示为 -256 而不是 -0 。

以此类推, 2 字节的short数据、 4 字节的int数据和 8 字节的long数据,也就能知道各对应的位数中符号位为 1 、其余位为 0 的值了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值