簡體   English   中英

如果結果必須是 int,為什么 Java 編譯器允許 int/int 除法?

[英]Why does the Java compiler allow int/int division if the result must be an int?

我想根據表格元素的條目索引提供實際頁面。 我使用PageRequest.of(int page, int size)

我有傳遞給 function 的index和一個常量PAGESIZE_SEARCH ,它是 50。

我想根據索引傳遞當前頁面如下:

PageRequest.of((int) index/PAGESIZE_SEARCH, PAGESIZE_SEARCH)

我的想法(IntelliJ Ultimate 2020.1.1)使我的投射變灰並暗示Casting 'index' to 'int' is redundant 如果我刪除強制轉換,即使編譯器接受它,我也不會得到運行時異常。

為什么是這樣? 那里的分區不安全嗎? 任何解釋將不勝感激。

該部門並非不安全; 它完全按照它應該做的那樣做。

將兩個整數相除稱為 integer 除法,只返回兩個數字相除的結果,沒有余數。

此外,正如評論中所指出的,您實際上是將index轉換為 int,而不是index/PAGESIZE_SEARCH - 考慮更精確地使用括號: (int) (index / PAGESIZE_SEARCH)

編輯:您可以在此處閱讀有關此主題的更多信息。

從數學上講,整數在除法下不是閉合的,這意味着將兩個任意 integer (如 3 和 5)相除的結果可能會導致 integer 無法表示的結果。 每個數學數字集合(無論是 N、ℤ、ℚ、ℝ、ℂ)都有一定的局限性,並且這些集合在計算機中的每個表示也有局限性。 了解這些限制是很重要的一點。

寫。 兩個整數的除法不被關閉,你可以用五種不同的方式處理這個問題,從數學上講:

  • 使除法部分 function。 這對於必須處理任意輸入的編程語言來說是不可取的。 每次嘗試對未定義除法的數字進行除法時,是否都會出現算術異常? 不是一個很好的方法。
  • 將 function 從 integer 除以實數。 這實際上是您可以使用的一種方法,但實數無法在計算硬件中精確表示,因此只能在近似解中。 它當然可以以這種方式實現編程語言,但實際上您更有可能對 integer 結果感興趣。
  • 以分數結果 (Q) 形式給出答案。 例如 3/5 變為 ⅗,有時表示為元組 (3,5)。 您可以在某些編程語言中執行類似的操作,例如 Haskell。
  • 給出商和余數的答案。 一些編程語言會這樣做,但是 Java 不支持元組類型,也不支持多個返回值,所以這個就out了。 這有時稱為歐幾里得除法
  • 只給出商作為答案,丟棄余數。 這通常稱為integer 除法,是 Java 實現的。 您可以通過相關的操作,即模運算符%來恢復余數。

JLS 在§15.7.2中指定了除法的工作方式:

Integer 除法向 0 舍入。也就是說,在二進制數值提升(第 5.6.2 節)之后為整數操作數 n 和 d 生成的商是 integer 值 q,其幅度盡可能大,同時滿足 |d ⋅ q| ≤ |n|。 此外,當 |n| 時 q 為正 ≥ |d| 並且 n 和 d 具有相同的符號,但是當 |n| 時 q 為負 ≥ |d| n 和 d 符號相反。

有一種特殊情況不滿足此規則:如果被除數是其類型可能最大量級的負 integer,除數為 -1,則 integer 發生溢出,結果等於被除數。 盡管溢出,在這種情況下不會拋出異常。 另一方面,如果 integer 除法中除數的值為 0,則引發 ArithmeticException。

此外,您實際上並沒有將除法的結果轉換為int 只是index轉換為int 演員表是無關緊要的和多余的,因為 integer 部門返回一個int ,如上所述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM