我似乎无法找到以下代码破解的原因:
从我的角度来看,发生的是整数lbnd减少
public class Test {
public static void main(String[] args) {
methode1();
}
static void methode1() {
int ubnd = Integer.MAX_VALUE;
int lbnd = ubnd;
while ((float)lbnd == (float)ubnd) {
--lbnd;
}
System.out.println((++lbnd) + ".." + ubnd);
}
}
问题是这个循环应该是我看到的无限循环,但是它在64个循环后中断,因为int的值发生了变化。结果是:
2147483584..2147483647
但它应该是一个无限循环:
2147483647..2147483647
答案 0 :(得分:2)
请记住,一个浮点数没有足够的精度来精确存储整数的所有32位。因此,对于高幅度的整数,(float)i和(float)(i-1)在浮点比较中是相同的。
(顺便说一句,在比较int和float时,它将被视为浮点数比较。所以为了说明一个额外的陷阱,你甚至不需要在==比较的一侧浮动。)
答案 1 :(得分:0)
要验证Neil Coffey的优秀答案,您可以通过其他输出查看代码的输出:
while ((float)lbnd == (float)ubnd) {
System.out.println(
"Lower Int " + lbnd
+ " Lower Float " + (float)lbnd
+ " .. Upper Int " + ubnd
+ " Upper Float "+ (float)ubnd);
--lbnd;
}
System.out.println((++lbnd) + ".." + ubnd);
答案 2 :(得分:0)
对于大的整数,一个包含多个整数的块遍及同一个浮点数,因此对于前几次迭代,lbnd的浮点转换保持等于ubnd的浮点转换。
从lbnd执行足够的int减法后,它足够小以映射到下一个较低的浮点值,并且两个浮点转换变得不同,从而结束循环。
答案 3 :(得分:0)
你正在减少和增加lbnd。这表明存在差异。一个是重要的(严格浮点数),最高可达数字16777217.如果您的虚拟机具有更高的精度(非严格),则数字可能更高。