LINUX.ORG.RU

one's complement помогите разобраться

 


0

1

Добрый день!

Пожалуйста, помогите разобраться - просмотрела разные материалы

в интернете, но все же приходится вернуться к этой базовой теме,

потому что не понимаю.

Меня интересует как с помощью one's complement положительное

число переводится в отрицательное. Я понимаю, что нужно

флипануть значения, но я не вижу, что результат дает именно

нужное число.

Например, возьмем 4х битовую систему:

7 in decimal переводим в binary, получается 0111;

чтобы сделать -7 с помощью one's complement, флипую

все цифры и получаю 1000. Если первая единица означает

знак, то получается, что это -8, но потом идут нули, как

получается -7? 1001 похоже на -7, хотя это 9, если

unsigned. тоже самое, если взять 5 и -5:

0101 это 5, тогда 1010 должно быть -5, но -8+2 = -6, а

а не -5.

Спасибо!

как получается именно -7?


Ответ на: комментарий от sin_a

белый стих ) меня так научили на С форуме - объяснили, что

нужно писать короткими предложениями, чтобы

помещались на экране

Ducol ()
Ответ на: комментарий от Ducol

У них неправильный форум. На правильном форуме строки не простираются направо в бесконечность, но заворачиваются по достижении правого края экрана. И читатель, таким образом, может читать строки такой длины как предпочитает, сделав окно нужной ширины.

Но если принудительно резать строки то на маленьких экранах они заворачиваются несколько раз: там где их принудил к этому автор и так где их принудил к этому край экрана. В результате чего форматирование текста превращается в фарш.

А главное — человеку не следует думать о разметке. Когда пишешь, следует думать о содержании. А ширину строки пусть регулирует автомат. Человек должен думать, а машина работать.

sin_a ★★★★★ ()
Последнее исправление: sin_a (всего исправлений: 1)
Ответ на: комментарий от Ducol

Тогда, боюсь, проблема значительно серьёзнее...

Ну, как бы, какое четырёхбитное число должно быть, чтобы при прибавлении к нему 1 получилось 0000?

Если и это непонятно, то, наверно, имеет смысл вернуться к какой-нибудь ещё более базовой теме, чем эта и попытаться понять, что же было упущено в самом начале обучения.

Stanson ★★★★★ ()
Ответ на: комментарий от Stanson

если к 15, то есть 1111 прибавить 1, то получится 0000 и единица overflow. вот еще к 7 и 5, например, 3 0011, one's complement 1100, как получается -3, если -8 + 4 = 4

Ducol ()
Ответ на: комментарий от Ducol

Но [code][/code] всё же иногда бывает полезно. Если без злоупотреблений.

sin_a ★★★★★ ()
Ответ на: комментарий от Ducol

Или тебе не нравится, что в onescomp. есть лишний ноль, поэтому круговая арифметика не работает? Так поэтому на всех вменяемых реализован twoscomp.

arturpub ★★ ()
Ответ на: комментарий от arturpub

инверсия да, но я не вижу математику, математика не получается: 00101011 это 43 очевидно 11010100 почему это -43? понятно, что флипуем, но за этим же должна быть математика. как получается -43? я там выше писала примеры с 5 и 3 и пыталась «посчитать» обратные значения и они все на единицу больше

Ducol ()
Ответ на: комментарий от Ducol

Ты пишешь сумбурно и похоже с ошибками, вот никто и не разбирается. Напиши один конкретный пример, что тебе в нем не нравится, и почему. На пальцах.

arturpub ★★ ()
Ответ на: комментарий от arturpub

В опе все твои ошиьки идут из ложной прсылки, что 1000 это -8. Нет, это -7. И 1000+0010 (-7+2) это 1010 (-5), все отлично получается, если через ноль не проходить. Потому что там два нуля, и традиционная математика «перестает» работать.

arturpub ★★ ()
Ответ на: комментарий от arturpub

Да, сумбурно, потому что не понимаю.

Пример с 5 и перевод в -5.

5 это 0101

инверсия дает 1010

я вижу ниже написано, что 1000 это -7, тогда математика в 1010 действительно дает -7 + 2 = -5

тогда почему же 1000 это -7 с точки зрения математики? я понимаю, что взяли 0111 и флипанули, получилось 1000. Как это проверить математически?

Спасибо!

Ducol ()
Ответ на: комментарий от arturpub

Например, если переводить 35 в -35 по системе two's complement, то математически все видно и понятно: 35 = 0010 0011

инверсия 1101 1100

добаляю 1 1101 1101 = -35

проверяю -128 + 64 + 16 + 8 + 4 + 1 = -35

А с one's complement такая гладкая математика у меня не получается.

Ducol ()
Ответ на: комментарий от Ducol

Флипануть обратно? Или увидеть, что 0111 (7) это топ-граница, и следующий за ней битовый паттерн это соотв. боттом-граница: 1000 (-7). Или что если к нулю 0000 прибавить единицу семь раз 0111, то к минус нулю 1111 нужно ее семь раз вычесть 1000. Это все так тривиально, потому что /по определению/, странно что тут может быть непонятным.

Диапазон от 1000 до 0111 (т.е. через 0) это диапазон -7 -6 -5 -4 -3 -2 -1 -0 0 1 2 3 4 5 6 7.

arturpub ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.