RSS RSS
Добавлено: 2005-10-29 21:45:18   Ошибка при операциях с беззнаковыми числами
Гость

Код:

cBigNumber a,b;
DWORD dw_num;
a.set("5F020007",16); // a = 5F020007
a.setshl(a,32); // a = 5F020007 00000000
dw_num = 0x8EDF3155; // dw_num = 8EDF3155;
b=a+dw_num; // b = 5F020006 8EDF3155, ожидалось 5F020007 8EDF3155


Ответить | Цитировать
Добавлено: 2005-10-29 21:46:49
Raul

Зарегистрирован(а): 17.03.2010

Сообщений: 101 (просмотреть)
Класс предназначен для операций с числами со знаком. Комбинированных операций со знаковыми и безнаковыми числами там нет, поэтому безнаковые числа DWORD преобразуются транслятором С в знаковые. Т.е. DWORD dw_num = 0x8EDF3155 - становится отрицательным числом.

Вот код для присваивания беззнакового значения:
Код:

cBigNumber a; // Неограниченное число.
DWORD dw_num = 0x8EDF3155UL; // Беззнаковое число.
{
a.expand (2); // Память под два слова.
long *pa = (long*) a.code(); // Указатель для модификации кода.
pa [0] = dw_num; // Присвоение числа.
pa [1] = 0; // Нулевое слово для знака.
pa [-1] = 1 + ((long)dw_num < 0); // Число слов.
} // Удалить указатель.


Ответить | Цитировать