|
|
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
Не совсем по теме, но более подходящего раздела я не нашёл. Господа, помогите, пожалуйста. Дано: А(десятичн.) = -1184 В (десятичн.) = -477 Найти значения С1 = А+В, С2 = А-В, С3 = В-А+, С4 = -А-В При этом требуется представить числа в двоично-десятичном формате, сформировать для них прямые коды, и используя обратный код по правилам двоично-десятичной арифметики, найти С1, С2, С3, С4. Результат должен быть представлен в прямом коде. Проблема в том, что когда пробую проделывать эти арифметические операции в обратном коде, то получается ерунда. Обратные коды я нашёл. А 2-10 обр = 1. 1000 1000 0001 0101 В 2-10 обр = 1. 0000 0101 0010 0010 Но когда пробую выполнять требуемые арифметические операции, то в результате получается неправильный ответ. Помогите разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2009, 10:33:43 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
24spam@tut.by, имеется в виду BCD? или просто двоичная арифметика? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2009, 12:11:04 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
Честно говоря, - не знаю. Мне надо выполнить это задание. Там никакой дополнительной информации нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2009, 12:52:26 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
Обратный код получается вычитанием из 9 числа , и затем прибавляется 1. Т.е. -1184 - это 1000 1000 0001 0110 -477 - это 1001 0101 0010 0011 -1184 + (-477) должно получиться -1661, т.е. в обратном коде 1000 0011 0011 1001 Посмотрим что получается. Складываем младшие разряды: 0110 + 0011= 1001 0001 + 0010 = 0011 1000+ 0101 = 1100 > 1001 - остается 0011 и перенос в старший разряд 1000 + 1001 = 10001 + перенос = 10010 > 1001 - остается 18-10 = 1000. Одновременно два переноса в старший разряд и из старшего говорит об отсутствии переполнения. Вроде всё верно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2009, 13:07:14 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
Ошибся немного. Действия с третьим разрядом так выглядят: 1000+ 0101 = 1101 > 1001 - остается 0011 и перенос в старший разряд ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2009, 13:11:38 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
2 Vowk Большое спасибо за помощь. Если позволите, несколько вопросов. 1) Значения выражений в каждой паре С1/С4 и С2/C3 отличаются лишь знаком, поэтому поэтому можно ли вычислить только модуль, а потом уже поставить 1 перед отрицательным зачением, и 0 - перед положительным? 2) Пробую вычислить С2 Это равносильно в обратном коде (-А)+В, т.е. в обратном коде -1184 + 477 делаю 1000 1000 0001 0110 + 0000 0100 0111 0111 = 1000 1100 1000 1101 А что делать дальше? Как я понимаю, надо в выделенные разряды добавлять 0110 ? Или что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2009, 15:03:42 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
24spam@tut.by 2) Пробую вычислить С2 Это равносильно в обратном коде (-А)+В, т.е. в обратном коде -1184 + 477 Равносильно с точки зрения арифметики, но не с точки зрения процессора. При таком подходе задание будет выполнено неверно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2009, 15:13:07 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
Vowk24spam@tut.by 2) Пробую вычислить С2 Это равносильно в обратном коде (-А)+В, т.е. в обратном коде -1184 + 477 Равносильно с точки зрения арифметики, но не с точки зрения процессора. При таком подходе задание будет выполнено неверно. А как тогда нужно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2009, 16:14:43 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
Во втором случае необходимо вычислить -1184 -(-477) и должно получиться -707, что в обратном коде 1001 0010 1001 0011 Операнды те же, только вместо сложения процессор должен выполнять вычитание. Начинаем с младщего разряда. 0110 - 0011 = 0011 0001 < 0010 => занимаем 1 из старшего разряда и не из 1 вычитаем 2, а из 11 = 9 = 1001. 1000 - 0101 : с учетом ранее сделанного заема на самом деле надо вычесть 0111 - 0101 = 0010 Последний разряд 1000 < 1001 : берем заем (из ниоткуда) и вместо 8 - 9 вычисляем 18 - 9 = 9 = 1001. Вроде получается, а вот насчет тестирования переполнения я призадумался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2009, 16:23:40 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
Вообще еще зависит от того, как определяется операция вычитания. Процессор может или на самом деле выполнять вычитание (как в приведенном решении), или заменять вычитание на сложение с числом в обратном коде - зависит от того, какой был выбран подход в теории. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2009, 16:28:08 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
В приведенном решении может возникнуть вопрос: каким образом практически выполняется "занимаем 1 из старшего разряда и не из 1 вычитаем 2, а из 11 = 9 = 1001". Ну, в теории может быть всё что угодно, а на практике (процессоры x86) в случае заема процессор превращает 0001 в 10001, т.е. не в 11, а в 17. Но существуют команды "десятичная коррекция сложения (DAA), вычитания (DAS)". Задача последней - в случае заема вычесть 6, и вместо 17 - 2 (что было бы неверно), на самом деле вычисляеся 11 -2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2009, 16:42:10 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
Ну, и если результат должен быть представлен в прямом коде, то в случае A-B мы видим, что старший байт 9 >=5 - значит, число отрицательное. Поэтому вычитаем из 9 каждый разряд: 0000 0111 0000 0110, а затем прибавляем 1: 0000 0111 0000 0111, что дает -707 (для запоминания знака "минус" видимо предполагается где-нибудь специальный бит или байт). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2009, 17:12:43 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
Знак, действительно, хранится в отдельном байте, который ставится перед модульной частью и отделён от него точкой. А как быть с другими выражениями? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2009, 22:22:56 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
С какими другими? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2009, 07:08:09 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
Vowk, C3 и C4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2009, 09:47:50 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
В случае C3 непонятно что сделать надо: почему знак + после числа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2009, 10:31:38 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
Vowk, Если честно, мне тоже не понятно. Думаю, просто надо сделать В-А. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2009, 14:14:56 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
Пора бы уже и разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2009, 20:31:02 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
VowkПора бы уже и разобраться. И тем не менее, не могли бы вы помочь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2009, 02:05:07 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
Если в третьем случае B-A, то B = 1001 0101 0010 0011 A = 1000 1000 0001 0110 0011 < 0110 : занимаем из 3-го разряда = 13 - 6 = 7 = 0111 и заем из следующего разряда 0010 - 0001 = 0001 и минус заем = 0000 0101 < 1000 : занимаем из старшего разряда = 15 - 8 = 7 = 0111 и заем из страшего разряда 1001 - 1000 = 0001 и минус заем = 0000 Результат 0000 0111 0000 0111 - уже находится в прямом коде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2009, 20:17:40 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
Vowk, спасибо вам большое за помощь, но не могли бы вы мне объяснить, как вы получили обратные коды двоично-десятичного представления? Я не понимаю, как из прямого двоично-десятичного кода числа -1184 (11.0001 0001 1000 0100) у вас получился 1000 1000 0001 0110? И как из прямого двоично-десятичного кода числа -477 (11.0000 0100 0111 0111) у вас получилось 1001 0101 0010 0011? Потому что у меня эти числа получились -1184 обр. код= 11.1000 1000 0001 0101 -477 обр. код = 11.1001 0101 0010 0010 Т.е., у меня значения отличаются на единицу. Мне сказали, что если +1 - то это будет уже дополнительный двоично-десятичный код, а мне нужен обратный . Где про это можно почитать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2009, 13:38:06 |
|
||
|
Двоично-десятичный формат
|
|||
|---|---|---|---|
|
#18+
24spam@tut.by, согласен, дополнительный код отличается от обратного на 1. Но ведь для сложения и вычитания отрицательных чисел нужен именно дополнительный код, а не обратный (насколько мне известно). Т.е. сначала получают обратный, затем дополнительный, и затем используют в арифметических операциях. Так что скорее всего несколько недопонимает ситуацию тот, кто составлял условие задание - здесь ничего поделать нельзя. Посмотри по Инету на эту тему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2009, 17:59:50 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=35990905&tid=1344459]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
191ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 493ms |

| 0 / 0 |
