Java 7和错综复杂的安全和非安全类型转换

日期: 2012-02-02 作者:Cameron McKenzie and Sal Pece翻译:张培颖 来源:TechTarget中国 英文

类型转换的问题之一就是有可能导致精度缺失,尤其是如果要进行转换的数字实际上超出了目标类型的范围。请看下面的代码:

以下是引用片段:
byte me = 10;
short stuff = 1031;
me = (byte)stuff;
System.out.println(me); //prints out 7

  在这个代码片段中,开发者将1031转换成字节,尽管实际上1031已经超出了字节的范围。进行代码编译,甚至能运转,但是开始运转时,控制台输出的打印值为7。很奇怪,对吗?这也是为什么我们提到这些转换类型是不安全的类型转换,他们不安全是因为为什么编译器不能自动反馈给你。

  类型转换:潜在精度缺失

  类型转换到一个更小的数据类型是不安全的类型转换,因为存在潜在的精度缺失。然而,大多数Java开发者不知道为什么时很少感到满意,所以尽管下面讨论的例子超过了Java 7认证考试的防伪,但我还会尽快解释一下。

  原始类型映射为16 bit存储,因此是二进制,1031就是下面这样:

以下是引用片段:
0000_0100_0000_0111

  然而,一个字节只有8 bit,所以当你将其转换为一个字节时,JVM只取最后16 bit后的8 bit,并将其转移到8 bit内存中,这也是要使用的部分。

以下是引用片段:
0000_0100_0000_0111 = 1031 (2^0 + 2^1 + 2^2 + 2^11) = (1024 + 4 + 2 + 1)
0000_0100_0000_0111 =  7   (2^0 + 2^1 + 2^2 +2)     = (       4 + 2 + 1)

  类型转换和二进制数据截取

  所以,在转换之后,字节保存二进制值为0000_011,转换成十进制就是7。所以在下面的代码运转时,控制台吐出的值就是数字7。

以下是引用片段:
byte me = 10;
short stuff = 1031;  // 0000_0100_0000_0111 in binary
me = (byte)stuff; // truncate the short down to 8 bits
System.out.println(me); //prints out 7

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

翻译

张培颖
张培颖

云计算网站编辑

相关推荐

  • Java 7特性:如何在项目Coin中更精确的重新抛出异常

    其他语言爱好者,如Scala或Clojure总是诋毁事实,说Java太冗长、繁琐。所以,在Java7中引入大量新设施,以帮助并减少应用程序开发者需要编写的代码,并不太另人吃惊。

  • Java 7:Switch和OCP认证

    首先,我讨厌switch声明。这真是个要命的程序,我经常看到初级程序员围着一个switch声明忙乎,我一直坚信存在更为面向对象的方法来处理这个问题。

  • JRuby和Java 7 我们可以期待什么

    Java 7已经粉墨登场了,这次带来的新功能感觉有些普普通通,当然还是有几个重要改进。那么对于在Java 7上运行的JRuby,我们能够期待些什么呢?

  • 红帽中间件鲜为人知的另一面

    红帽公司的副总裁兼中间件事业部总经理Craig Muzilla是个大忙人。尽管红帽以Linux发行版名扬天下,但该公司依托JBoss搞起了一块主要的企业软件业务。