从 double 和 long 转换为 int 的细节

The specifics of casting to int, from double and long

嗨,所以我最近看到一个问题的结构很像这样

int a= (int) Math.pow(2,32);
System.out.println(a); //prints out Integer.MAX_VALUE

我回答完问题后发现我答错了,我回答了Integer.MIN_VALUE,但正确答案是Integer.MAX_VALUE。经过进一步测试后,我意识到我将任何双精度转换为大于 Integer.MAX_VALUE 的 int 只会使 int 等于 Integer.MAX_VALUE。 例如

int a = (int) ((double) Integer.MAX_VALUE+100);
System.out.println(a); //prints out Integer.MAX_VALUE

经过进一步测试,我意识到如果您尝试将 long 转换为 int,它似乎会将 int 分配给看似随机的数字。

所以我的问题是。到底是怎么回事,为什么当你将它转换为一个 int 时,double 值不会溢出整数?以及为什么将 long 转换为 int return 一个看似随机的数字

为了将双精度值转换为整数,它将擦除后点值,余数就像向下舍入双精度值 对于第一个问题,int 将 return 它可以在 8 位中保存的值,所以它似乎是 min.value 长一= Math.pow(2,32);会给你 max.value 并将 long 转换为整数 这不是随机数。它是长数的最右边的 32 位 对不起我写的不好 英语是我的第二语言

这些转换的逻辑是 Java 语言规范的一部分,Item 5.1.3

你可以看到,当从 long 转换为 int 时,最高有效位被丢弃,留下最低有效的 32 位。

而且,如果舍入 doublefloat 的结果是一个太小或太大而无法表示为 int(或 long), 将选择最小或最大可表示数。

我们无法在这里回答 "why" 很久以前就做出的决定。但这是语言的定义方式,您可以相信它在您工作的任何 Java 环境中都是相同的。