LINUX.ORG.RU
ФорумTalks

Двоичное представление числа, two's complement, системы счисления, минус ноль и все все все

 низкий уровень,


1

1

1) Чтобы перевести число из десятичной системы в двоичную, нужно его делить на 2 (основание системы) а потом остатки прочитать взад. Для меня это - просто хитрый приём. А почему он работает?

2) Как так получается в two's complement, что если мы хотим получить отрицательное число, то применяем побитовое отрицание и прибавляем единицу? Почему это работает?

3) Везде сейчас используется two's complement? Или one's complement тоже?

4) Я пока что не знаком с работой компилятора, поэтому не знаю, что отвечает за запоминание того, signed переменная или unsigned?

Комбинаторики не было еще что ли?

Solace ★★
()

Каникулы вроде бы закончились?

luke ★★★★★
()

Чтобы перевести число из двоичной системы в десятичную, нужно его делить на 10 (основание системы) а потом остатки прочитать взад. Для меня это - просто хитрый приём. А почему он работает?

Если плохо представляешь, а программирование толком учить не хочешь, включи «программистский» режим в калькуляторе и тыкай в битики до просветления. Насчёт гнома не знаю, но в кедах такое есть.

ziemin ★★
()

1) Разберись почему при записи числа одна и та же цифра принимает различные значения.
2) Гугли в торону «дополнительный код»
3) Это прямой что ли? Дополнительный проще в железной реализации.
4) А х.з. Как-то и не думал об этом...

Stahl ★★☆
()

1) Чтобы перевести число из десятичной системы в двоичную, нужно его делить на 2 (основание системы) а потом остатки прочитать взад. Для меня это - просто хитрый приём. А почему он работает?

потому что [latex]A_0=\sum_{i=0}^n a_i2^i, a_i=\{0,1\}[/latex]

Мы знаем, что [latex]2^k>\sum_{i=0}^{k-1}2^i[/latex]

поэтому деля [latex]A_0[/latex] на 2 мы получаем [latex]A_1=\sum_{i=0}^{n-1} a_i2^i[/latex] и [latex]a_n[/latex] в остатке. Ну и деля дальше мы получи все [latex]a_i[/latex]

2) Как так получается в two's complement, что если мы хотим получить отрицательное число, то применяем побитовое отрицание и прибавляем единицу? Почему это работает?

метод тот же - вырази все математически и поймешь.

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 3)

Ну попробуй сначала потренироваться с 3-4 битиками. Поприбавлять единички и поотнимать единички. Для 4 бит интервал будет как раз [-8..7] — вполне сносно для наглядного осмысления.

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

поэтому деля на 2 мы получаем [latex]A_1=\sum_{i=1}^{n}a_i2^{i-1}[/latex] и [latex]a_0[/latex] в остатке. Ну и деля дальше мы получи все a_i.

//fixed

dikiy ★★☆☆☆
()

man Чарльз Петцольд «Код».

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

что отвечает за запоминание того, signed переменная или unsigned?

Ничто не отвечает. Это важно только при представлении информации, арифметика работает и без знаний, положительное число или отрицательное.

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

Гм. Кстати да.
Вот что иногда странный вопрос делает с неподготовленным человеком:)

Stahl ★★☆
()

4) В памяти (при работе программы) между signed и unsigned различий нет. Зато у процессора есть разные инструкции, которые работают с целыми числами как со знаковыми или беззнаковыми. Следовательно, эту информацию компилятор держит у себя в памяти и согласно ей генерирует нужные инструкции.

UPD: как справедливо отметил lenin386, это важно только при сравнении чисел, вводе-выводе и преобразовании, например, в дробный формат (с плавающей точкой), а также при умножении и делении.
Сложение и вычитание совершенно одинаково работают со знаковыми и беззнаковыми числами - собственно, в этом и суть «дополнительного кода».

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)

1) В этом и есть суть поразрядной записи чисел. Чтобы перевести число из десятичной системы в десятичную, нужно его делить на 10 (основание системы) а потом остатки прочитать взад.

2/4) Потому что как бы замыкается вокруг нуля. ~0000+1==0000 (-0=0). В середине диапазона переход 0111 (7) -> 1000 (-8, оно же 8). Удобно тем, что при сложении и вычитании результат верен для обеих интерпретаций, то есть signed и unsigned он только в голове (и немножко в CF/SF).

arturpub ★★
()

Где ты учишься? У меня такая же лекция была неделю назад. Все сидели с лицом типа «Пффф», но мне было интересно послушать, хотя рассказывали очевидные вещи.

CYB3R ★★★★★
()

1) Потому что деление с остатком не зависит от записи числа. Ты можешь делить на два в двоичной системе или в десятичной; остатки будут одни и те же.

2) Арифметика по модулю 2^<разрядность>. А по этому модулю «минус единица» — это то же самое, что число 2^<разрядность>-1, что записывается одними единицами. Теперь вычти из этого исходное число (n), и получишь его two's complement; по построению, это будет не что иное как -1-n. Значит, если прибавить ещё единичку, будет как раз -n.

3) Что значит one's complement?

4) Э-э-э... компилятор и отвечает.

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