您好,登录后才能下订单哦!
为什么一个byte的存储范围是-128~127?
文本关键字:byte、字节、二进制位、反码、补码
文章目录
为什么一个byte的存储范围是-128~127?
**1. 反码
1 byte = 8 bit(比特)
这8个bit就是8个二进制位,其中有一个是符号为,刚好可以用0和1来代表正负。那么这8个二进制位到底能够表示多大范围的数字呢?对于正数的进制转换相信难不倒大家,也可以参考底部的相关文章,我们先来看一下负数在二进制下是如何表示和转换的。
二、反码与补码
首先把公式立在这里:
正数的补码 = 原码 = 反码
负数的补码 = 反码 + 1
那么首先什么是原码呢?很简单,在我们不考虑符号的情况下,按照进制的转换方法将一个十进制数转换为二进制数,再添加上相应的符号位就完成了。符号位出现在最前(左)面一位,0代表正数,1代表负数。
+3 -> 11 -> 根据符号和byte长度补全:0000 0011
-5 -> 101 -> 根据符号和byte长度补全:1000 0101
那么为什么会提出反码和补码的概念呢?有两个原因:
1. 反码
保证在二进制下能够正常的进行正负数间的运算。
首先我们来看一下如果直接使用原码存储,在进行正负数运算的时候会出现什么样的情况。5+(-3)=2,那么在二进制下的运算也和十进制一样,直接相加,该进位进位,但是符号位没法直接参与运算,换句话说,让计算机直接判断算式最后的正负其实比较困难。
原码计算:0000 0011 + 1000 0101 = 1000 1000,结果是:-8(不需要纠结最后的符号位应该取什么,因为在计算机中并没有采用这种方法进行计算,只是举例)。显然,直接采用原码计算的这种方式在正数下是没问题的,但是在负数时就不适用了,所以我们需要重新定义一个规则对负数进行处理。
由于在正数下计算是没问题的,那么就可以规定:正数的反码等于原码,负数的反码为除去符号位,其他取反。
+3 -> 原码:0000 0011 -> 反码:0000 0011
-5 -> 原码:1000 0101 -> 反码:1111 1010
反码计算后:1111 1101 -> 原码:1000 0010 -> 十进制:-2。嗯,好像没什么问题了,但是当一个正数和一个负数的运算结果为正数(如:+5和-3,大家可以自己验证)或者恰好为0时还是会有问题。
2. 补码
+0和-0的冲突问题。
从相反数的概念我们可以知道,一个正数肯定存在一个与之对应的相反数,对于整数来说我们只要直接改变一下符号位就行了。But!这个0就很特殊,有一个耳熟能详的概念:0的相反数还是0,这会直接导致进制的转换不是一一对应的关系了。
+2 -> 原码:0000 0010 -> 反码:0000 0010
-2 -> 原码:1000 0010 -> 反码:1111 1101
反码计算后:1111 1111 -> 原码:1000 0000 -> 十进制:-0。结果貌似正确,但是在正数中:0000 0000也同样代表0。那么对于1000 0000,是不能直接被抹去的,那就让它来代表一个特殊的数字吧:-128。
其实,特殊的不只是这一个数字,如对于Java中的short,占用两个字节,最高一位为符号位,那么就会出现这个数字:1000 0000 0000 0000,从原码上看也是-0,对于int类型也是一样,那么这个问题就可以总结为:符号位为1,其他位均为0,我们应该怎么处理。
于是,为了解决这一类问题,就有了补码的概念:负数的补码 = 反码 + 1。我们用临界位置的计算来进行举例,如:(-2)+(-126)=-128。
-2 -> 原码:1000 0010 -> 反码:1111 1101 -> 补码:1111 1110
-126 -> 原码:1111 1110 -> 反码:1000 0001 -> 补码:1000 0010
补码运算结果:1000 0000(该类数字没有原码和反码)
到此我们该敲个黑板,划个重点了:在内存中都是使用补码来进行计算的(整数类型)!
三、byte的数据范围
明确了上面几个概念,那么byte的范围应该就很清楚了。
最大的正数:0111 1111 -> 2^7 - 1 = 127
最大的负数:1000 0000 -> -2^7 = -128
对于其他正数类型的范围也是如此:
Java中的short:2字节 -> -2^15 ~ 2^15 - 1
Java中的int:4字节 -> -2^31 ~ 2^31 - 1
Java中的long:8字节 -> -2^63 ~ 2^63 - 1
不同语言定义的数据类型在内存中占用的字节数是不同的,而且也不需要直接记这些范围,一般来说记字节就好。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。