[英]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、ℤ、ℚ、ℝ、ℂ)都有一定的局限性,並且這些集合在計算機中的每個表示也有局限性。 了解這些限制是很重要的一點。
寫。 兩個整數的除法不被關閉,你可以用五種不同的方式處理這個問題,從數學上講:
%
來恢復余數。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.