Java中的算术运算

Java中的算术运算,java,math,int,Java,Math,Int,有人能解释一下为什么Java中对整数类型的算术运算总是产生“int”或“long”结果吗?因为基本整数算术运算符只能在int和int之间或long和long之间定义。在所有其他情况下,类型会自动加宽以适应。毫无疑问,书中有一些深奥的段落准确地解释了发生的事情。虚拟回答:因为这就是 4.2.2. 整数运算 Java编程语言提供了许多作用于整数值的运算符: [……] 产生int或long类型值的数字运算符: 看看这个: 它解释了返回值的类型如何由操作数的类型决定。基本上: 算术运算符需要数字类

有人能解释一下为什么Java中对整数类型的算术运算总是产生“int”或“long”结果吗?

因为基本整数算术运算符只能在
int
int
之间或
long
long
之间定义。在所有其他情况下,类型会自动加宽以适应。毫无疑问,书中有一些深奥的段落准确地解释了发生的事情。

虚拟回答:因为这就是

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

[……]

  • 产生
    int
    long
    类型值的数字运算符:
看看这个:

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

  • 算术运算符需要数字类型
  • 如果任一操作数的类型为整数类型,则返回值将是包含的最宽类型(因此int+long=long)
  • 如果任一操作数的类型为浮点数,则将返回浮点数
  • 如果两个操作数都是浮点,则如果其中一个操作数都是双精度的,则将返回双精度
如果需要控制类型,则需要将操作数强制转换为适当的类型。例如,int*int对于int可能太长,因此您可能需要执行以下操作:

long result = myInt * (long) anotherInt

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

你的意思是为什么不得到一个
double
biginger
结果?主要是历史事故和效率原因。检测来自
+
*
的溢出并处理结果(例如来自
Integer.MAX\u VALUE*Integer.MAX\u VALUE
)意味着生成大量异常检测代码,这些代码几乎永远不会被触发,但始终需要执行。定义模2^32(或2^64)的加法或乘法要容易得多,而且不用担心。用分数余数除法也一样


很久以前,C语言就是这样。如今,使用超标量处理器和大量可玩的位,问题就不那么严重了。但是人们已经习惯了它,所以它仍然存在于Java中。如果您希望将算术自动转换为能够保存结果的类型,请使用Python 3。

原因与我们在Java中使用基本类型的原因大致相同——它允许编写高效的代码。您可能会争辩说,这也会使效率较低但正确的代码更加丑陋;你大概是对的。请记住,设计选择是在1995年左右做出的。

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

这些编程语言中有许多是在Java之前发明的,很多是在Java之后发明的,所以我认为,认为这是硬件能力较低时代遗留下来的问题的观点是不正确的。语言设计的这个特性是关于使语言类型安全。在编程语言中分离整数和浮点数,让程序员负责识别从类型到类型的转换何时以及如何进行,有很好的理由