private static void convert(int x) {
// assume we've passed in x=640.
final int y = (x + 64 + 127) & (~127);
// as expected, y = 768
final int c = y;
// c is now 320?!
}
Есть ли разумные объяснения, почему приведенный выше код привел бы значения выше? Этот метод вызывается из JNI. x
, который передается вначале, имеет тип С++ int
, который static_cast
равен jint
следующим образом: static_cast<jint>(x);
В отладчике с точкой останова, заданной для назначения y, я вижу x = 640. Шагая по одной линии, я вижу y = 768. Шаг второй линии и c = 320. Используя отладчик, я могу установить переменную c = y, и она правильно назначит ей 768.
Этот код является однопоточным и работает много раз в секунду, и тот же результат всегда наблюдается.
Обновление от комментариев ниже
Эта проблема исчезла полностью после дня отладки. Я обвинял его в космических лучах, если бы это не происходило воспроизводимо в течение целого дня. Самое странное, что я видел очень долгое время.
Я оставлю этот вопрос открытым какое-то время, если у кого-то есть представление о том, что может это сделать.