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

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

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

int型强转short

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

首先看下面的情况:

test_level_1

先手算一下结果看看。

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

test_level_1_result

/
下面解释原理
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型

看下面的情况:

test_level_2

手算下结果看看

/
/
/
/
/
/
/
/
/
/
/
/
/
输出结果是-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型

看下面的情况

test_level_3

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

/
结果是65535

test_level_3_result

分析一下原理

/
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

以上就是本文全部内容

七夕快乐

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tomshidi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值