long a = (long)Math.pow(2, 32);
// a = 4294967296 :)
long a = (int)(long)Math.pow(2, 32);
//a = 0 ?!
long a = (int)Math.pow(2, 32);
//a = 2147483647 WTF??!!!
第一个表达式很明显,a会按照原样打印出来。
第二个表达式有点令人困惑。大数值是100000000000000000000000000000000,即32个零后面跟着1,总共33位。
当它被强制转换为int时,为什么会被视为0?难道不应该将最高位的1作为符号位,并认为这个数字是-2147483648吗?[疑问已解决] 另外,当从Math.pow(4.294967296E9)返回的double直接转换为int时,为什么是2147483647?
我正在阅读一本关于类型转换和数据类型的书,但其中的文本并没有解释得很清楚。我感到困惑。请解释一下为什么第二个和第三个表达式会产生那些结果。
2^32
在二进制中是一个后面跟着32个零的1。同样地,10^10
在十进制中是一个后面跟着10个零的1。http://coppervinesoftware.com/2to32.png - jdmichal8*4=32
个零位。1
是第33位,被舍弃了。 - user541686