Я борюсь с действительно странной ситуацией, которую я не могу объяснить.
В принципе, я не понимаю, почему результаты модуля или деления между двумя шестнадцатеричными числами неверны (я использую C
).Странное поведение при делении шестнадцатеричных чисел
У меня есть переменная time
которая является 32bit unsigned int
и инициализируется в 0, а затем другие два 32bit unsigned ints
, div
и res
, как инициализируется 0 тоже.
if (time > 0x1388) {
div = time/0x1388;
res = time - (0x1388 * div);
}
Этот фрагмент кода должен действовать в качестве оператора модуль между time
и 0x1388
. Time
- переменная, которая увеличивается по всей моей программе, и когда ее значение больше, чем 0x1388
, мне нужно, чтобы его остаток выполнял другие вычисления.
Это пример ошибочной расчетной величины. Предположим, что time
составляет 0x1770
, что больше 0x1388
. Разделение между 0x1770
и 0x1388
должно быть 0x1
(div
) с напоминанием о 0x3E8
(res
). Проблема в том, что после выполнения этого кода div
всегда 0x0FFFFF
вместо 0x1
и res
получает действительно странное значение.
Я уже пытался использовать модуль, но результат тот же. Может кто-нибудь объяснить мне, что происходит?
Возможно, это связано с тем, что я использую unsigned ints
? Если да, можете ли вы рассказать мне, какие операции мне нужно соблюдать при использовании unsigned ints
?
EDIT: Попытка добавить еще какой-то код ...
file1.c
unsigned int res = 0, div = 0, time = 0; // global variables
unsigned int valueChecker() {
if (time > 0x1388) {
div = time/0x1388;
res = time - (0x1388 * div);
}
return res;
}
Эта функция вызывается периодически по истечении определенного промежутка времени
fileB.c
extern unsigned int time;
void calculate() {
// do some stuff
time += getHEXTime(); // this function has been supplied and return time as an HEX number
// do other stuff
}
Эта функция вызывается главным образом несколькими раз, между другими вычислениями (которая не включает time
, div
или res
).
Я был бы так благодарен, если кто-то может мне помочь!
Не могли бы вы опубликовать [Минимальный, * Полный * и Подтверждаемый пример] (http://stackoverflow.com/help/mcve)? – MikeCAT
Стандартная библиотека C имеет функции 'time' и' div', поэтому моя первая попытка будет использовать другие имена, не зная, будет ли она работать. – MikeCAT
Спасибо за ваши комментарии ... Я не использую имена времени и div var, и я не думаю, что есть конфликты, потому что я не использую стандартную библиотеку C. Это просто голой C-код, который должен быть выполнен на эмуляторе ARM. – matteodv