将Short.MAX_VALUE递增(溢出)为零,而不是Short.MIN_VALUE

时间:2017-02-17 10:33:18

标签: java integer-overflow short

我正在处理在 Firefox Chrome 中正常工作的应用程序中的'tabindex'缺陷,但不是 Internet Explorer 。 'tabindex'是通过JSP通过静态'int'设置的,每次使用时都会递增。

private static short tabIndex = 1;

sb.append("<select tabindex='").append(tabIndex++) ...

Internet Explorer maximum 'tabindex'为32767(Short.MAX_VALUE)。因此,我可以将int更改为short,但在达到最大值后,它会在Short.MIN_VALUE左右。

  

Tab键顺序中省略了具有负tabIndex的对象。

所以我需要它从Short.MAX_VALUE进展到零。 显然,编写一些代码来执行此操作是微不足道的,但我想知道是否有一些聪明的简写方法可以增加到严格正数,或者我可以使用的其他数据类型。

2 个答案:

答案 0 :(得分:1)

您可以通过使用0x7FFF对值进行AND运算来确保MSB始终为0。

short s = 32767;
short s1 = (short)(s & 0x7FFF); // s1 = 32767 (or 0x7FFF)
s++; // s = -32768 (or 0x8000)
short s2 = (short)(s & 0x7FFF); // s2 = 0

您可能希望将增量和位掩码提取到自己的方法,并在append内使用。

我不是在宽恕这段代码,因为它不是很清楚,坦率地从作业中返回不是我会使用的东西,但以下是一个非常短的版本:

public short incIndex() {
    return tabIndex = (short)(tabIndex+1 & 0x7FFF);
}

...append(incIndex())...

答案 1 :(得分:0)

为什么不创建我们自己的处理此限制的包装器类型?

public class ShortValueForTab {

    private short value;       

    public short next() {
        value++;
        if (value < 0) {
            value = 0;
        }
        return value;
    }

}

并在您的客户端代码中:

private static ShortValueForTab tabIndex =  new ShortValueForTab();
...    
sb.append("<select tabindex='").append(tabIndex.next()) ...