关于java中强制转换

在百度上遇到一个问题,描述如下:

在java中,定义两个变量

byte x = (byte) 128;
byte y = (byte)-129;

输出后,为什么结果是-128和128?

借此机会,自己也认真的思考了一下这个问题,并得出了正确的结果,下面就谈谈我的理解。

这种问题在刚开始学习java的时候确实令我很费解来的,因为如果只是局限在java语言本身中,这个问题是没法得到真正的解的,顶多也是知其然不知其所以然。一年多来对计算机系统的更深入的学习,我在现可以尝试着去解答这个问题了。

首先你要知道,在计算机中数是以二进制形式存在的,而且可以有三种表示方式,原码,反码,补码。

首先讨论第一个数128。java中默认整数是int类型(4字节长)的,并且在机器中用补码表示,所以它在计算机内部存储的二进制串为:

00000000 00000000 00000000 10000000

这是128的二进制补码形式,一共是四字节,32位,其中最高位0为符号位,代表正数。

这时候对128进行强制类型转换,因为byte只有1字节,即8位,所以这个二进制串就要被截短,截取的规则是:只保留低8位:

10000000

被截取掉的只是1前面的24个0,看起来好像并没有影响数据大小,但这个时候的二进制串还表示128吗?

不是了,因为byte的最高位也是符号位!也就是说现在1被用来作符号位了,即代表是负数, 后面的7个0000000才用来表示数值,结合起来1 0000000 代表的就是-128。

所以这就是为什么128强制转换类型后会变成-128的原因,知道了这点,其他情况的类型转换也是可以类似分析的。

比如看下-129的情况

-129依然是存储为四字节,它的原码为:10000000 00000000 00000000 10000001

不过计算机中存储的是补码形式,所以它存储的二进制串为:11111111 11111111 11111111 01111111

还是一样的,强制转换,只保留低低八位:01111111

最高位同样为符号位,即0,表示为正数,1111111表示数值,为128

所以结果就是128.

上一篇:云原生数据库 2.0:一站式全链路数据管理与服务


下一篇:BZOJ2342[Shoi2011]双倍回文——回文自动机