Перейти к содержанию
    

Сложение двух отрицательных чисел.

Уважаемые форумчане. Не так давно столкнулся с такой проблемой, нужно складывать два числа. Как работать с отрицательными числами понятно, получаем дополнительный код и вперёд.  И всё как бы просто. Однако, возникает некоторая тонкость, до тех пор пока нет переполнения, нет проблем, однако в случае переполнения начинает возникать чехарда и полная неразбериха, ну если это делать на "простой" логике и побитовых сумматорах с переносом. Вопрос. Как контролировать переполнения при работе с отрицательными числами? Для примера, если на 13 битной шине (12 бит данных +знак) складывать (-4000) + (-4000) получается переполнение и если 4000 + 4000 тоже получается переполнение, однако с положительными числами всё понятно, а вот с отрицательными числами результат переполнения не так очевиден, потому что переполнение начинает "лезть" в знак. Вот такой вот у меня вопрос, девчонки и парни.

Изменено пользователем МАСТЕР LO

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Используется знаковое расширение слагаемых. 12 разрядов расширяем до 13.

 

5 минут назад, МАСТЕР LO сказал:

девчёнки

В суффиксах после шипящих под ударением пишется о, без ударения е.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, МАСТЕР LO said:

Как контролировать переполнения при работе с отрицательными числами?

классика, знаковое расширение + 1 бит, сложение, анализ двух старших бит(если 01 - положительное переполнение, 10 отрицательное), усечение.  

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, andrew_b сказал:

Используется знаковое расширение слагаемых. 12 разрядов расширяем до 13.

 

В суффиксах после шипящих под ударением пишется о, без ударения е.

опечатка, принято

2 минуты назад, des00 сказал:

классика, знаковое расширение + 1 бит, сложение, анализ двух старших бит(если 01 - положительное переполнение, 10 отрицательное), усечение.  

 

Спасибо, а под знак необходимо теперь тоже два бита?  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, МАСТЕР LO said:

Спасибо, а под знак необходимо теперь тоже два бита?  

Почему, также один знак. Число то вышло за пределы входной разрядной сетки. По выходу либо увеличиваете разрядность на 1 бит, либо добавляйте логику ограничения максимального диапазона чисел на входной разрядности

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, des00 сказал:

Почему, также один знак. Число то вышло за пределы входной разрядной сетки. По выходу либо увеличиваете разрядность на 1 бит, либо добавляйте логику ограничения максимального диапазона чисел на входной разрядности

Тогда получается для сложения 12 разрядов чисел необходимо, собственно 12 разрядов, то 13й разряд это переполнение 12 разрядных вычислений, 14й разряд - это сам знак. 15й разряд признак того, что число в дополнительном коде. Только при такой конфигурации переполнение не "лезет в знаковый разряд". Правильно я понял? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 minutes ago, МАСТЕР LO said:

Тогда получается....

складывается ощущение что вам надо учебник по компьютерной математике в дополнительном коде изучить.  

берем ваш пример знаковое число 13 бит, дополнительный код s12, диапазон чисел -4096...4095, в hex формате это 13'h1000 и 13'h01111 соответственно.

считаем -4096(13'h1000) - 4096(13'h1000). Для этого знаково расширяем число до 14 бит. 

14'h3000 (-4096) + 14'h3000(-4096) = 14'h2000 (-8192) 

старшие биты 14ый и 13ый == 2'h2 == 2'b10 - есть отрицательное переполнение:

1. если решаем что теперь работаем в 14 бит сетке, то не делаем ничего, результат 14'h2000 (-8192)

2. если сетка должна остаться 13 бит, то нужно сделать ограничение и результат 13'h1000 (-4096)

 

тетрадь, карандаш и потренируйтесь на кошках. для начала рекомендую взять 4-х битные числа -8..+7. так быстрее. 

потом распишите как будет выглядеть -4096(13'h1000) - 1 (13'h1FFFF) в 13 битной сетке. ну и положительные числа посмотреть. 

ЗЫ.  Если вы работает прямом или обратном коде, тогда переведите его в дополнительный и считайте. Но так вроде уже давно никто не работет. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, des00 сказал:

складывается ощущение что вам надо учебник по компьютерной математике в дополнительном коде изучить.  

берем ваш пример знаковое число 13 бит, дополнительный код s12, диапазон чисел -4096...4095, в hex формате это 13'h1000 и 13'h01111 соответственно.

считаем -4096(13'h1000) - 4096(13'h1000). Для этого знаково расширяем число до 14 бит. 

14'h3000 (-4096) + 14'h3000(-4096) = 14'h2000 (-8192) 

старшие биты 10 - есть отрицательное переполнение:

1. если решаем что теперь работаем в 14 бит сетке, то не делаем ничего, результат 14'h2000 (-8192)

2. если сетка должна остаться 13 бит, то нужно сделать ограничение и результат 13'h1000 (-4096)

 

тетрадь, карандаш и потренируйтесь на кошках. для начала рекомендую взять 4-х битные числа -8..+7. так быстрее. 

потом распишите как будет выглядеть -4096(13'h1000) - 1 (13'h1FFFF) в 13 битной сетке. ну и положительные числа посмотреть. 

ЗЫ.  Если вы работает прямом или обратном коде, тогда переведите его в дополнительный и считайте. Но так вроде уже давно никто не работет. 

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

5 минут назад, des00 сказал:

1. если решаем что теперь работаем в 14 бит сетке, то не делаем ничего, результат 14'h2000 (-8192)

2. если сетка должна остаться 13 бит, то нужно сделать ограничение и результат 13'h1000 (-4096)

в целом всё понятно, поэтому конечно спасибо за подробное объяснение, всё логично

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, МАСТЕР LO said:

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

Ну например Цифровая схемотехника  и архитектура компьютера второе издание Дэвид М. Харрис и Сара Л. Харрис. раздел "СИСТЕМЫ СЧИСЛЕНИЯ"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, des00 сказал:

Ну например Цифровая схемотехника  и архитектура...

спасибо, уже скачиваю....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

28 минут назад, МАСТЕР LO сказал:

Ну например Цифровая схемотехника  и архитектура...

ещё раз спасибо, вообще всё отлично написано, а то я весь гугл перерыл, а толку не было

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 час назад, МАСТЕР LO сказал:

Ну например Цифровая схемотехника  и архитектура...

Книжка в целом хорошая и замечательная, но там не написано ничего, чего бы я не изучал в институте...   Ответа на главный вопрос, как складывать два отрицательных числа там увы нет. И чёткой логики, когда отбрасываем старший, он же знаковый, он же разряд переполнения там нет.  И получается в итоге, что единого алгоритма сложения двух знаковых чисел нет.  Точнее, получается нужно делать несколько сумматоров,  для положительных чисел, для положительных и отрицательных, а для сложения собственно отрицательных чисел, те чисел представленных в дополнительных кодах ещё один.  И в каждом сумматоре необходимо учитывать, когда перенос работает, а когда перенос не работает.   И в дополнение к этому ещё лепить блоки определения положительное число или отрицательное, естественно с конвертацией в дополнительный код и запуском соответствующей ветки...   Ну не ужели нету другого какого-то алгоритма попроще. Или я смотрел в книгу и видел фигу? Ну очень хочется попроще.....

Изменено пользователем МАСТЕР LO

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, МАСТЕР LO said:

Точнее, получается нужно делать несколько сумматоров,  для положительных чисел, для положительных и отрицательных, а для сложения собственно отрицательных чисел, те чисел представленных в дополнительных кодах ещё один.  И в каждом сумматоре необходимо учитывать, когда перенос работает, а когда перенос не работает. 

Странно. Вроде всегда был один и тот же алгоритм для сложения чисел, независимо от их знака. Хватало бы разрядности в сумматоре. Как вариант - сначала расширить разрядность операндов до требуемой (копированием знакового разряда во все более старшие разряды), а потом складывать их.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 minutes ago, МАСТЕР LO said:

Ответа на главный вопрос, как складывать два отрицательных числа там увы нет.

Эммм,

Quote

Неоспоримым преимуществом дополнительного кода является то, что привычный способ сложения работает как в случае положительных, так и отрицательных чисел. (с) Глава 1 книги

Вы в тетради примеры делали? по битно, в столбик? я же не зря вам предложил взять 4-х битные числа -8..+7 и перебрать все возможные комбинации сложения с учетом знакового расширения. Ну или хотя бы взяли стандартный калькулятор виндовз в режиме "программист" и посмотрели битики?

сложение/вычитание любых чисел в дополнительном коде с ростом разрядности результата для борьбы с переполнениями: на каждое сложение/вычитание разрядность результата растет на 1 бит. 

  bit [7 : 0] a, b;
  bit [8 : 0] sum;
  bit [8 : 0] rslt;

  always_comb begin
    sum  = {a[7], a} + {b[7], b}; // {a[7], a} - {b[7], b};
    rslt = sum;
  end

сложение/вычитание любых чисел в дополнительном коде без роста разрядности с обработкой переполнений: на каждое сложение/вычитание разрядность результата сохраняется 

  bit [7 : 0] a, b, rslt;
  bit [8 : 0] sum;

  always_comb begin
    sum = {a[7], a} + {b[7], b}; // {a[7], a} - {b[7], b};
    if (sum[8] ^ sum[7]) begin
      rslt = sum[8] ? 8'h80 : 8'h7F;
    end
    else begin
      rslt = sum[7 : 0]; 
    end
  end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 часа назад, МАСТЕР LO сказал:

Ну например Цифровая схемотехника  и архитектура...

Тогда вот такой пример: берём 5 + 5 = 10,  знаковый разряд  0 числовые разряды 101, получаем 0101 + 0101 =  1010, в знаковом разряде переполнение, результат ошибка, его пропускать нельзя. Другой пример, -7 + 2 = 5, считаем снова : 7  в знаковом разряде 1 числовые разряды 001,   1001 + 0101 = 1110, здесь в знаковом разряде присутствует 1, которая является знаком минус....       вот и получается, что в одном случае у нас переполнение, в другом отрицательное число и получается, что ветки расчёта необходимо на начальном этапе разделять...      за примеры спасибо,   хочу сказать, что мне необходимо реализовать это действие не на аппаратном сумматоре в плис, а булевой "на рассыпухе", в виде побитового сложения с переносом. 

module module_summ_1_bit                      // модуль сумматора 2х двоичных чисел / вычисление суммы нулевых (1) разрядов / вычисление переноса суммы нулевых (1) разрядов
    
                  (
                           input   a,                  //  вход разряда a           
                           input   b,                  //  вход разряда b    
                           input   p_in,             //  вход переноса предыдущего разряда p_in    
                          output  c,                 //  выход разряда с    
                          output  p_out           //  выход переноса предыдущего разряда output p_out                 
                         );
                      wire k, l, m, n, o, p, r;   

// вот так 
//   вычисление          суммы  разрядов 

  
              assign k = ~ a & ~ b &   p_in;
              assign l =   b & ~ a & ~ p_in;
              assign m = ~ b &   a & ~ p_in;
              assign n =   b &   a &   p_in;
               
             assign c = k | l | m | n;

 

//   вычисление переноса суммы  разрядов 

 

             assign o =   a &   b;
             assign p =   a &   p_in;
             assign r =   b &   p_in;
                                    
             assign p_out = o | p | r;
    
endmodule

1.png

Изменено пользователем МАСТЕР LO

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...