【问题标题】:The specifics of casting to int, from double and long从 double 和 long 转换为 int 的细节
【发布时间】:2019-06-30 15:10:18
【问题描述】:

嗨,我最近看到一个类似这样的问题

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 会返回一个看似随机的数字

【问题讨论】:

  • 不是随机数。它是最右边的 32 位。
  • 我猜双重转换包含像 if( int_val > Integer.MAX_VALUE ) { return Integer.MAX_VALUE; } 这样的代码,当然 C 语言除外。您是否尝试过查看 Open JDK 项目中的源代码?

标签: java casting integer double long-integer


【解决方案1】:

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

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

此外,如果将 doublefloat 舍入的结果是一个太小或太大而无法表示为 int(或 long)的数字,则最小或最大可表示数字将被选中。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-01-20
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 2016-12-20
      • 2014-09-30
      相关资源
      最近更新 更多