Простое присваивание с неправильным значением

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.

Этот код является однопоточным и работает много раз в секунду, и тот же результат всегда наблюдается.

Обновление от комментариев ниже

Эта проблема исчезла полностью после дня отладки. Я обвинял его в космических лучах, если бы это не происходило воспроизводимо в течение целого дня. Самое странное, что я видел очень долгое время.

Я оставлю этот вопрос открытым какое-то время, если у кого-то есть представление о том, что может это сделать.

Ответ 1

Шаг 01: скомпилируйте его правильно, см. комментарии под своим сообщением.

при необходимости я с этим кодом он пойдет: Код С#:

private void callConvert(object sender, EventArgs e)
        {
            string myString = Convert.ToString(convert123(640));
            textBox1.Text = myString;
        }
    private static int convert123(int x) {
    // assume we've passed in x=640.
    int y = (x + 64 + 127) & (~127);
    // as expected, y = 768
    int c = y;
    // c is now 320?!
    return (c);
}

но его код С#

и tipp для вас НИКОГДА не называйте свою функцию именем, которое используется в компиляторе в качестве стандартного.  конвертировать в большинстве используемых языков.

(system.convert)

Ответ 2

Вы недавно установили c до 320? Если это так, возможно, оно было сохранено в некоторой памяти, и компилятор, возможно, переназначил его на то, что он думал, а не каким он должен быть. Я, частично, догадываюсь.

Ответ 3

Похоже, проблема с размером байтов памяти временных переменных, если программа оптимизирована для использования памяти. Отладчик может быть ненадежным. Я вижу, если временное ~ 127 хранится в байте, то вы можете достичь этого сценария. Все зависит от того, что хранится ~ 127 во время выполнения.