[英]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.