![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
olven |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 18 Пол: Женский Репутация: ![]() ![]() ![]() |
Программа умножает двоичные числа в дополнительном коде. Но умножает неправильно. Помогите пожалуйста найти проблему
var |
![]() ![]() |
Федосеев Павел |
![]()
Сообщение
#2
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 298 Пол: Мужской Реальное имя: Федосеев Павел Репутация: ![]() ![]() ![]() |
происходит переполнение разрядной сетки переменной n.
Если ограничить множители 8-ю битами, т.е. диапазоном (-128...+127), то While k<=64 do begin <---- k<8 В дополнительный код неправильно переводит отрицательные числа. Опять же, если ограничиться 8-ю битами, то число (-210)=-102=1111 11102. Алгоритм такой: все 8 бит исходного числа инвертируешь и прибавляешь 1. (-210)=-102=1111 11012 доп+1=1111 11102 доп При умножении двух чисел нужно умножать их модули, а потом с учётом знака результата переводить или не переводить в дополнительный код. Если не сложно, немного реструктурируй код: ввод строки, преобразования в двоичный, в дополнительный коды вынеси в процедуры или функции. А ещё, приведи исходную постановку задачи. Сообщение отредактировано: Федосеев Павел - 24.03.2012 17:06 |
olven |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 18 Пол: Женский Репутация: ![]() ![]() ![]() |
происходит переполнение разрядной сетки переменной n. Если ограничить множители 8-ю битами, т.е. диапазоном (-128...+127), то While k<=64 do begin <---- k<8 В дополнительный код неправильно переводит отрицательные числа. Опять же, если ограничиться 8-ю битами, то число (-210)=-102=1111 11102. Алгоритм такой: все 8 бит исходного числа инвертируешь и прибавляешь 1. (-210)=-102=1111 11012 доп+1=1111 11102 доп При умножении двух чисел нужно умножать их модули, а потом с учётом знака результата переводить или не переводить в дополнительный код. Если не сложно, немного реструктурируй код: ввод строки, преобразования в двоичный, в дополнительный коды вынеси в процедуры или функции. спасибо большое. поняла. правда 8 бит это немало? мне нужно переводить именно длинные числа... попробовала для длинных не совсем то что нужно выдает... |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 18:56 |