我们从观察开始讨论 -2147483648 == Integer.MIN_VALUE (= -(2³¹)). 表达式 p -= Math.pow(1,0) 具有来自 double 至 int 自 Math.pow(...) 返回一个 double . 带有显式强制转换的表达式如下所示
p = (int) (p - Math.pow(1,0))
ideone演示 更进一步,我们得到
double d = p - Math.pow(1,0);
p = (int) d;
ideone演示 如我们所见, d 有价值吗 -2.147483649E9 (= -2147483649.0 ) < Integer.MIN_VALUE . cast的行为由java14jls控制,§5.1.3: 5.1.3. 缩小基本转换 ... 浮点数到整数类型的缩小转换 T 采取两个步骤: 在第一步中,将浮点数转换为 long ,如果 T 是 long ,或 int ,如果 T 是 byte , short , char ,或 int ,如下所示: 如果浮点数是 NaN (§4.2.3),转换第一步的结果为 int 或长0。 否则,如果浮点数不是无穷大,则将浮点数舍入为整数值 V ,使用ieee 754向零舍入模式向零舍入(§4.2.3). 然后有两种情况: 如果 T 是 long ,此整数值可以表示为 long ,则第一步的结果是 long 价值 V . 否则,如果此整数值可以表示为 int ,则第一步的结果是 int 价值 V . 否则,必须满足以下两种情况之一: 值必须太小(一个很大的负值或负无穷大),并且第一步的结果是类型的最小可表示值 int 或者 long . 值必须太大(大幅度的正值或正无穷大),并且第一步的结果是类型的最大可表示值 int 或者 long . 第二步: 如果 T 是 int 或者 long ,转换的结果就是第一步的结果。 ...
public class MyClass {
public static void main(String args[]) {
int p=-2147483648;
p-=(int)Math.pow(1,0);
System.out.println(p);
p-=1;
System.out.println(p);
}
}
2条答案
按热度按时间wf82jlnq1#
我们从观察开始讨论
-2147483648 == Integer.MIN_VALUE
(= -(2³¹)).表达式
p -= Math.pow(1,0)
具有来自double
至int
自Math.pow(...)
返回一个double
. 带有显式强制转换的表达式如下所示ideone演示
更进一步,我们得到
ideone演示
如我们所见,
d
有价值吗-2.147483649E9
(=-2147483649.0
)< Integer.MIN_VALUE
.cast的行为由java14jls控制,§5.1.3:
5.1.3. 缩小基本转换
...
浮点数到整数类型的缩小转换
T
采取两个步骤:在第一步中,将浮点数转换为
long
,如果T
是long
,或int
,如果T
是byte
,short
,char
,或int
,如下所示:如果浮点数是
NaN
(§4.2.3),转换第一步的结果为int
或长0。否则,如果浮点数不是无穷大,则将浮点数舍入为整数值
V
,使用ieee 754向零舍入模式向零舍入(§4.2.3). 然后有两种情况:如果
T
是long
,此整数值可以表示为long
,则第一步的结果是long
价值V
.否则,如果此整数值可以表示为
int
,则第一步的结果是int
价值V
.否则,必须满足以下两种情况之一:
值必须太小(一个很大的负值或负无穷大),并且第一步的结果是类型的最小可表示值
int
或者long
.值必须太大(大幅度的正值或正无穷大),并且第一步的结果是类型的最大可表示值
int
或者long
.第二步:
如果
T
是int
或者long
,转换的结果就是第一步的结果。...
tktrz96b2#
请注意
Math.pow()
使用double类型的参数进行操作并返回double。将其转换为int将产生预期的输出:上述操作产生以下输出:
2147483647
2147483646