当前位置: 代码迷 >> J2SE >> Java类型转换的一个有关问题
  详细解决方案

Java类型转换的一个有关问题

热度:58   发布时间:2016-04-23 19:47:06.0
Java类型转换的一个问题
如题,代码为

int a = (int) Math.pow(2, 31);
System.out.println(a);

输出为:2147483647,即2^31-1,这是为什么咧?
------解决思路----------------------
ava中int是4个字节即32位 --> 数值范围长度是2的32次方
java中没有unsign数值的概念,因此正数和负数各占一半
负数:[-2的31次方, 0)
正数:[0, 2的31次方-1]   将0作为正数处理
(int) Math.pow(2, 31)已经超出其最大值
------解决思路----------------------
int占4个字节,8*4=32位。首位为符号位,剩余31位,11111......1(31个1)为其最大值,等于10000...0(31个0)-1,即2^31-1。
------解决思路----------------------
Math的静态方法是pow(double,double);,返回值也是double(8字节)
并且方法说明里面:If both arguments are integers, then the result is exactly equal to the mathematical result of raising the first argument to the power of the second argument if that result can in fact be represented exactly as a double value.
double占八字节是完全可以表示int的(远比int表示的范围大)
pow(2,31)精确表示其结果为double型的2.147483648E9
强制转换从8字节变为4字节截断数字丢失末尾精度,即刚好为Integer.MAX_VALUE
其实超过这个值的截断都是Integer.MAX_VALUE

  相关解决方案