0

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

4

6 回答 6

1

看看这个:http: //www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter02/operators.html#ArithOps

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

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

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

long result = myInt * (long) anotherInt

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

于 2012-05-13T20:58:18.463 回答
1

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

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

于 2012-05-14T09:32:22.343 回答
0

因为基本整数算术运算符仅定义在intandint或 between longand之间long。在所有其他情况下,类型会自动加宽以适应。毫无疑问,Java 语言规范中有一些深奥的段落准确地解释了发生了什么。

于 2012-05-13T20:55:32.620 回答
0

虚拟答案:因为这是Java 语言规范定义它们的方式:

4.2.2. 整数运算

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

[...]

  • 数值运算符,产生一个intor类型的值long
于 2012-05-13T20:56:21.177 回答
0

你的意思是为什么你没有得到一个doubleBigInteger结果?主要是历史事故和效率原因。+检测or溢出*并处理结果(Integer.MAX_VALUE * Integer.MAX_VALUE例如 from )意味着生成大量异常检测代码,这些代码几乎永远不会被触发,但总是需要被执行。定义加法或乘法模 2^32(或 2^64)要容易得多,不用担心。与小数余数除法相同。

很久以前的 C 语言肯定就是这种情况。如今,对于超标量处理器和大量可使用的位,这已不再是问题。但是人们已经习惯了它,所以它今天仍然存在于 Java 中。如果您希望您的算术自动转换为可以保存结果的类型,请使用 Python 3。

于 2012-05-13T21:04:33.167 回答
0

原因有点像我们在 Java 中使用原始类型的原因——它允许编写高效的代码。您可能会争辩说,它也会使效率降低但正确的代码变得更丑陋;你是对的。请记住,设计选择是在 1995 年左右做出的。

于 2012-05-13T21:16:43.347 回答