Простое присваивание с неправильным значением
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 во время выполнения.