类型转换的问题之一就是有可能导致精度缺失,尤其是如果要进行转换的数字实际上超出了目标类型的范围。请看下面的代码:
以下是引用片段: 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中国
相关推荐
-
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搞起了一块主要的企业软件业务。