java中整型数据转换深入解析

下面我会用几个例子讲解转换的原理

int型强转short

这种强转是不推荐的,会导致高位数据丢失,浮点型会导致精度丢失。但是既然有这种方法,说明它是有存在的必要的。

首先看下面的情况:

java 内存数据转Int java int转short_脱单

先手算一下结果看看。

/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
正确结果是-1

java 内存数据转Int java int转short_short_02

/
下面解释原理
0x7fffffff 的二进制形式为
0111 1111 1111 1111 1111 1111 1111 1111
立即数是int型  int型四个字节  所以是32位 
上面就是Integer.MAX_VALUE的值  是int型的最大值
java中的数值是有符号型的,没有unsigned类型,所以上面的int最大值的最高位为0 表示正数
short类型是短整型  只有2个字节 
所以对0x0fffffff进行强转后的b变量值为 0xffff 截取低地址的2字节 
二进制为 1111 1111 1111 1111 最高位为1  负数  这个是补码形式
转换成十进制就是-1

结论是:字节数多的数据类型(简称高级类型吧)强转为比它字节数少的数据类型(简称低级类型吧)时,截取是从低地址开始的

short型赋值给int型

看下面的情况:

java 内存数据转Int java int转short_short_03

手算下结果看看

/
/
/
/
/
/
/
/
/
/
/
/
/
输出结果是-1

分析一下原理

/
上面已经解释了b变量的值为-1
现在把short类型变量b的值赋给int型变量 intc 
把一个固体球放到一个空间大它一倍的容器中 会发生什么呢  结果显而易见  固体球没变化 容器中多了一个固体球
那么把一个short赋给int,intc的值和b的值在十进制下是完全一致的,都是-1
但是二进制下有区别 b的二进制是       1111 1111 1111 1111
intc的二进制是 1111 1111 1111 1111 1111 1111 1111 1111

运算符两边是int型和short型

看下面的情况

java 内存数据转Int java int转short_int_04

节省一下篇幅,这里就不用代码块隔开结果了

/
结果是65535

java 内存数据转Int java int转short_short_05

分析一下原理

/
b & 0xffff 中的0xffff是立即数 立即数为整型 实际应该为0x0000 ffff 四字节
b自动升级为int 具体值为十进制-1 原理请看上面的例子 十六进制为0xffff ffff

-------------------------具体运算-----------------------------
     0000 0000 0000 0000 1111 1111 1111 1111
b	 1111 1111 1111 1111 1111 1111 1111 1111
					位与
 
结果 0000 0000 0000 0000 1111 1111 1111 1111

注意,这个时候符号位依然是最高位,符号位为0  正数  上面的二进制就是原码 转成十进制就是
65535

以上就是本文全部内容

七夕快乐