Java中int与long基本整数类型强转输出异常原因咨询
问题原因解析
你的问题核心是浮点数转整数类型时的规则差异,导致int和long的最小值计算不符合预期,具体拆解如下:
1. byte/short为什么能得到正确的最小值?
以(byte)(pow(2,7))为例:
pow(2,7)返回128.0,这个值在int的取值范围内(int最大值为2147483647),所以Java会先把128.0转成int类型的128;- 再把int类型的
128转成byte类型:int的128二进制是00000000 00000000 00000000 10000000,截断低8位后得到10000000,而byte是8位有符号整数,这个二进制对应补码的-128,符合预期。
short的情况完全同理:pow(2,15)得到32768.0,先转成int的32768,截断低16位后是10000000 00000000,对应short的-32768。
2. int/long为什么得到最大值而非最小值?
这是因为pow(2,31)和pow(2,63)的结果超出了对应整数类型的最大值范围:
- 对于int:
pow(2,31)返回2147483648.0,而int的最大值是2147483647,这个浮点数超出了int的上限; - 对于long:
pow(2,63)返回9223372036854775808.0,而long的最大值是9223372036854775807,同样超出上限。
根据Java语言规范:当将大于目标整数类型最大值的浮点数转换为该类型时,结果直接等于该类型的最大值,而不会像byte/short那样先转成更大的整数再截断。这就是为什么你得到的是2147483647和9223372036854775807,而非预期的最小值。
3. 正确的写法建议
如果要获取整数类型的最小值,推荐直接使用Java提供的常量,或者用整数位运算(避免浮点数转换的问题):
// 直接用常量 System.out.println(Byte.MIN_VALUE); System.out.println(Short.MIN_VALUE); System.out.println(Integer.MIN_VALUE); System.out.println(Long.MIN_VALUE); // 用位运算(注意long类型要加L标识) System.out.println((byte)(1 << 7)); // 等价于Byte.MIN_VALUE System.out.println((short)(1 << 15)); // 等价于Short.MIN_VALUE System.out.println((int)(1 << 31)); // 等价于Integer.MIN_VALUE System.out.println(-(1L << 63)); // 等价于Long.MIN_VALUE
内容的提问来源于stack exchange,提问作者vidyapu sandeep
相关产品推荐
相关产品推荐

