java基本数据类型byte的取值范围-128~127,以及溢出后取值的实现
byte取值范围的计算和溢出取值的计算:
- 首先看一下byte类型在java.lang包下的源码,源码指定了byte类型的最大值和最小值。
2.在计算机内存存放的数值都是补码形式,第一位为符号位(可以百度补码概念),对应的取值如下:
负整数转换成二进制
方法:先是将对应的正整数转换成二进制后,对二进制取反,然后对结果再加一。还以42为例,负整数就是-42,如图4所示为方法解释。最后即为:(-42)10=(11010110)2.
补码 | 原码 | 十进制 | 备注 |
---|---|---|---|
0111 1111 | 0111 1111 | 127 | 正数最大值 |
0000 0001 | 0000 0001 | 1 | 正数最小值 |
1111 1111 | 1000 0001 | -1 | 负数最大值 |
1000 0001 | 1111 1111 | -128 | 负数最小值 |
- 综上可得byte类型的取值范围为-128~127
- 而当发生溢出时,例如:
首先byte b = 127,进行了++b操作之后,变成了128,127二进制表示为:0111 1111,+1后:1000 0000,因为计算机的数值都是补码形式表示,所以
1000 0000
为补码,因为第一位为1,所以其为负数,进行取反:0111 1111,加1得到1000 0000,2的7次方=128
即数值为128,又因为其为负数,所以值为-128。
综上所述:溢出后的128的实际值为-128。下面再举个例子验证一下:
127二进制补码为:0111 1111,进行累加操作之后,
0111 1111
+1
1000 0000
+1
1000 0001
变为129
129的原码和补码为 1000 0001
首位为1,其为负数,将补码取反加一得到0111 1111
数值为127加上符号位,结果为-127