java基本数据类型byte的取值范围-128~127,以及溢出后取值的实现

byte取值范围的计算和溢出取值的计算:

  1. 首先看一下byte类型在java.lang包下的源码,源码指定了byte类型的最大值和最小值。
    java基本数据类型byte的取值范围-128~127,以及溢出后取值的实现_第1张图片
    2.在计算机内存存放的数值都是补码形式,第一位为符号位(可以百度补码概念),对应的取值如下:

负整数转换成二进制

        方法:先是将对应的正整数转换成二进制后,对二进制取反,然后对结果再加一。还以42为例,负整数就是-42,如图4所示为方法解释。最后即为:(-42)10=(11010110)2.

java基本数据类型byte的取值范围-128~127,以及溢出后取值的实现_第2张图片

 

补码 原码 十进制 备注
0111 1111 0111 1111 127 正数最大值
0000 0001 0000 0001 1 正数最小值
1111 1111 1000 0001 -1 负数最大值
1000 0001 1111 1111 -128 负数最小值
  1. 综上可得byte类型的取值范围为-128~127
  2. 而当发生溢出时,例如:

java基本数据类型byte的取值范围-128~127,以及溢出后取值的实现_第3张图片 

 

 首先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。下面再举个例子验证一下:

 java基本数据类型byte的取值范围-128~127,以及溢出后取值的实现_第4张图片

127二进制补码为:0111 1111,进行累加操作之后,

0111 1111

+1

1000 0000

+1

1000 0001

变为129
129的原码和补码为 1000 0001
首位为1,其为负数,将补码取反加一得到0111 1111
数值为127加上符号位,结果为-127 

你可能感兴趣的:(计算机原理)