Умножение 2 положительных чисел дает отрицательный результат

Возможный дубликат:
Как Java обрабатывает целочисленные недополнения и переполнения и как бы вы это проверили?
Умножение двух целых чисел становится отрицательным

Моя программа представляет собой реализацию фильтра Блума. Однако, когда я сохраняю результаты своей хэш-функции в битовом массиве, функция (из form f(i) = (a*i + b) % m, где a, b, i, m — все положительные целые числа) дает мне отрицательный результат. Проблема, по-видимому, заключается в вычислении a*i, которое оказывается отрицательным.

Игнорируйте операторы печати в коде; те были для отладки. По сути, значение temp в этом блоке кода оказывается отрицательным, поэтому я получаю ArrayOutOfBoundsException.

m — длина битового массива, z — количество используемых хеш-функций, S — набор значений, которые являются членами этого фильтра Блума, а H хранит значения a и b для хеш-функций f1, f2,... , фз.

public static int[] makeBitArray(int m, int z, ArrayList<Integer> S, int[] H)
{
    int[] C = new int[m];
    for (int i = 0; i < z; i++)
    {
        for (int q = 0; q < S.size() ; q++)
        {
            System.out.println(H[2*i]);
            int temp = S.get(q)*(H[2*i]);
            System.out.println(temp);
            System.out.println(S.get(q));
            System.out.println(H[2*i + 1]);
            System.out.println(m);
            int t = ((H[2*i]*S.get(q)) + H[2*i + 1])%m;
            System.out.println(t);
            C[t] = 1;
        }
    }
    return C;
}

person krandiash    schedule 30.09.2012    source источник
comment
Связано: stackoverflow.com/questions/3001836, stackoverflow.com/questions/512266   -  person Tomasz Nurkiewicz    schedule 30.09.2012


Ответы (2)



Используйте 1_. (http://en.wikipedia.org/wiki/Integer_overflow)

person Jiri Kremser    schedule 30.09.2012
comment
К вашему сведению, такие короткие и мгновенные ответы не одобряются SO и могут быть подвергнуты отрицательному голосованию (независимо от того, правильно это или нет). Если это все, что вам нужно сказать, вы должны использовать средство комментирования. - person Marko Topolnik; 30.09.2012
comment
Иногда меньше да лучше, но в целом согласен. - person Jiri Kremser; 30.09.2012
comment
И быстрый совет, и ссылка, вероятно, полезны для OP, но ответы должны быть направлены на общепризнанный вклад. Вклад должен быть автономным и не скрываться за ссылкой — ссылки должны использоваться только в качестве ссылок, подтверждающих ваши утверждения. Обратите внимание, что я просто передаю знания, а не критикую вас. Я прошел тот же процесс новичка в начале этого года :) Когда вас минусуют за фактически правильный и, по вашему мнению, полезный ответ, это неприятно, поэтому вы учитесь, как этого избежать :) - person Marko Topolnik; 30.09.2012