Java中的算术运算

时间:2012-05-13 20:48:19

标签: java math int

有人可以解释为什么对Java中的整数类型的算术运算总会导致“int”或“long”结果?

6 个答案:

答案 0 :(得分:1)

检查出来:http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter02/operators.html#ArithOps

它解释了返回值的类型如何由操作数的类型决定。基本上:

  • 算术运算符需要数字类型
  • 如果任一操作数的类型是整数类型,则返回值将是包含的最宽类型(因此int + long = long)
  • 如果任一操作数的类型是浮点数,则返回浮点数
  • 如果两个操作数都是浮点数,那么如果任一操作数是双重
  • ,则返回double

如果需要控制类型,则需要将操作数转换为适当的类型。例如,对于int,int * int可能太长,因此您可能需要执行:

long result = myInt * (long) anotherInt

同样,对于算术运算产生的非常大或非常小的浮点数。

答案 1 :(得分:1)

我认为值得指出的是(对整数生成整数的算术运算)是许多编程语言的一个特征,而不仅仅是Java。

许多这些编程语言都是在Java之前发明的,很多都是在Java之后发生的,所以我认为从硬件能力不强的那些时代开始就认为它是一个悬而未决的问题。语言设计的这一特性是关于使语言类型安全。在编程语言中分离整数和浮点数有很好的理由,并使程序员负责确定何时以及如何从类型到类型的转换。

答案 2 :(得分:0)

因为基本整数算术运算符仅在intint之间或longlong之间定义。在所有其他情况下,类型会自动加宽以适应。毫无疑问,Java Language Specification中有一些深奥的段落可以解释究竟会发生什么。

答案 3 :(得分:0)

虚拟答案:因为这是Java Language Specification defines them

的方式
  

4.2.2。整数运算

     

Java编程语言提供了许多作用于整数值的运算符:

     

[...]

     
      
  • 数值运算符,其值为intlong
  •   

答案 4 :(得分:0)

您的意思是为什么没有获得doubleBigInteger结果?历史事故和效率的原因,大多数。检测来自+*的溢出并处理结果(来自Integer.MAX_VALUE * Integer.MAX_VALUE,比方说)意味着生成大量异常检测代码,几乎永远不会被触发,但始终需要执行。更容易定义加法或乘法模2 ^ 32(或2 ^ 64)而不用担心它。对于具有小数余数的除法也是如此。

很久以前用C来肯定就是这种情况。今天使用超标量处理器和很多比特的问题就不那么严重了。但是人们习惯了它,所以今天它仍然存在于Java中。如果您希望算术自动转换为可以保存结果的类型,请使用Python 3.

答案 5 :(得分:0)

原因与我们在Java中使用原始类型的原因相同 - 它允许编写高效的代码。您可能会认为它也会使效率更低但代码更正确更加丑陋;你是对的。请记住,设计选择是在1995年左右完成的。