java中整型数据转换深入解析
下面我会用几个例子讲解转换的原理
int型强转short
这种强转是不推荐的,会导致高位数据丢失,浮点型会导致精度丢失。但是既然有这种方法,说明它是有存在的必要的。
首先看下面的情况:
先手算一下结果看看。
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
正确结果是-1
/
下面解释原理
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型
看下面的情况:
手算下结果看看
/
/
/
/
/
/
/
/
/
/
/
/
/
输出结果是-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型
看下面的情况
节省一下篇幅,这里就不用代码块隔开结果了
/
结果是65535
分析一下原理
/
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
以上就是本文全部内容
七夕快乐