【问题标题】:data type of results of java arithmetic calculationjava算术计算结果的数据类型
【发布时间】:2012-04-16 10:32:33
【问题描述】:

在java中,我知道算术计算结果的数据类型取决于计算中涉及的数字的数据类型。 例如,

  1. int + int = int

  2. long/double=double

一个。但我找不到任何可以给我所有这些规则的参考资料。有人可以帮我吗?

b.如何避免算术计算中的溢出?例如,2 long 的结果可能不再适合 long...

非常感谢。

【问题讨论】:

    标签: java math type-conversion


    【解决方案1】:

    一个。这些规则称为数值提升规则,在Java Language Specification, §5.6.2 (currently) 中指定。

    b.处理溢出有两种普遍接受的方法。

    第一种方法是后检查,您可以在其中执行操作,例如加法,然后检查结果是否大于任一操作数。例如:

    int c = a + b;
    
    if( c<a) {  // assuming a>=0 and b>=0
       // overflow happened
    }
    

    第二种方法是预先检查,您基本上首先尝试避免溢出发生。示例:

    if( a > Integer.MAX_INTERGER - b ) {
       // overflow happened
    }
    

    【讨论】:

    • 您的第一张支票并不总是有效的。如果 b 为负数,c &lt; a 将为真而不会溢出。
    • 确实如此。我将把它添加到示例中。但我只是在说明方法,并没有给出万无一失的解决方案。
    • 是的,我知道这不是一个完整的解决方案。我只是想指出这一点,所以海报没有逐字记录。
    【解决方案2】:

    Java 语言规范中处理这些规则的特定部分是section 4

    如果您根本不希望值溢出,请使用 BigInteger 或其他任意精度的算术类型。

    为了在一般情况下避免溢出,Guava(我参与其中)提供了像 IntMath.checkedAdd(int, int)LongMath.checkedMultiply(long, long) 这样的方法,它们在溢出时抛出异常。 (其中一些您自己实现起来并不简单,但这些都经过了非常详尽的测试。)您可以查看源代码以了解它们是如何工作的,但它们中的大多数依赖于可爱的小技巧来有效地检查溢出。

    【讨论】:

      【解决方案3】:

      对任何两个原始整数操作数进行算术运算的结果将至少是一个 int -- 即使操作数是字节和短整数。

      【讨论】:

        【解决方案4】:

        问题 A 的答案:

        具有“较大类型”的操作数的类型

        Double 是“最大”的类型

        注意:char 和 boolean 不能与算术运算符一起使用

        来源:https://www.geeksforgeeks.org/type-conversion-java-examples/

        【讨论】:

          猜你喜欢
          • 2017-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-05
          • 2017-05-29
          • 1970-01-01
          相关资源
          最近更新 更多