Почему предпочитают дополнение two по знаку-и-величине для чисел со знаком?

Мое впечатление - то, что Ваша база данных довольно огромна или очень плохо разработанная, если Linq2Sql не соответствует Вашим потребностям. У меня есть приблизительно 10 веб-сайтов, и больше и меньших все использование Linq2Sql. Я смотрел и платформа Объекта много раз, но я не могу найти серьезное основание для использования ее по Linq2Sql. Это сказало, что я пытаюсь использовать свои базы данных в качестве модели, таким образом, у меня уже есть от 1 до 1 отображения между моделью и базой данных.

В моем текущем задании у нас есть база данных с 200 + таблицы. Старая база данных с большим количеством плохих решений, таким образом, там я видел преимущество Платформы Объекта по Linq2Sql, но тем не менее я предпочту перепроектировать базу данных начиная с базы данных, является механизмом приложения и если база данных будет плохо разработана и медленная тогда, то мое приложение также будет медленным. Используя платформу Объекта на такой базе данных походит на quickfix для маскировки плохой модели, но это никогда не могло маскировать плохую производительность, которую Вы получаете от такой базы данных.

196
задан Deduplicator 9 July 2017 в 00:12
поделиться

10 ответов

Это сделано для того, чтобы сложение не нуждалось в специальной логике для работы с отрицательными числами. Прочтите статью в Википедии .

Допустим, у вас есть два числа: 2 и -1. В вашем «интуитивном» способе представления чисел они будут 0010 и 1001 , соответственно (я придерживаюсь 4-х битного размера). В способе дополнения до двух они равны 0010 и 1111 . Теперь предположим, что я хочу добавить их.

Добавление двух дополнений очень просто. Вы добавляете числа обычно, и любой бит переноса в конце отбрасывается. Итак, они складываются следующим образом:

  0010
+ 1111
=10001
= 0001 (discard the carry)

0001 равно 1, что является ожидаемым результатом «2 + (- 1)».

Но в вашем «интуитивном» методе сложение сложнее:

  0010
+ 1001
= 1011

Какое -3, верно? Простое сложение в этом случае не работает. Следует отметить, что одно из чисел отрицательное, и в этом случае использовать другой алгоритм.

Для этого «интуитивного» метода хранения вычитание - это другая операция, чем сложение, требующая дополнительных проверок чисел, прежде чем они могут быть добавлен. Поскольку вы хотите, чтобы самые основные операции (сложение, вычитание и т. Д.) Выполнялись как можно быстрее, вам необходимо хранить числа таким образом, чтобы можно было использовать самые простые возможные алгоритмы.

Кроме того, в «интуитивном» методе хранения , есть два нуля:

0000  "zero"
1000  "negative zero"

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

Там ' s еще один бонус с хранением int таким образом, и именно тогда вам нужно расширить ширину регистра, в котором хранится значение. С дополнением до двух, сохранение 4-битного числа в 8-битном регистре - это вопрос повторения его старший значащий бит:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

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

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

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

Вам все равно необходимо установить эти дополнительные 4 бита в обоих случаях, но в «интуитивном» случае вам также необходимо очистить 5-й бит. Это один крошечный дополнительный шаг в одной из самых фундаментальных и распространенных операций, имеющихся в каждом приложении.

s, когда вам нужно увеличить ширину регистра, в котором хранится значение. С дополнением до двух, сохранение 4-битного числа в 8-битном регистре - это вопрос повторения его самого старшего бита:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

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

С помощью вашего метода вам потребуется очистить существующий бит, что является дополнительной операцией в дополнение к заполнению:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

Вам все равно нужно установить эти дополнительные 4 бита в обоих случаях, но в «интуитивном» случае вам также нужно очистить 5-й бит. Это один крошечный дополнительный шаг в одной из самых фундаментальных и распространенных операций, присутствующих в каждом приложении.

s, когда вам необходимо увеличить ширину регистра, в котором хранится значение. С дополнением до двух, сохранение 4-битного числа в 8-битном регистре - это вопрос повторения его самого старшего бита:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

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

С помощью вашего метода вам потребуется очистить существующий бит, что является дополнительной операцией в дополнение к заполнению:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

Вам все равно необходимо установить эти дополнительные 4 бита в обоих случаях, но в «интуитивном» случае вам также необходимо очистить 5-й бит. Это один крошечный дополнительный шаг в одной из самых фундаментальных и распространенных операций, имеющихся в каждом приложении.

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

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

С помощью вашего метода вам потребуется очистить существующий бит, что является дополнительной операцией в дополнение к заполнению:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

Вам все равно нужно установить эти дополнительные 4 бита в обоих случаях, но в «интуитивном» случае вам также необходимо очистить 5-й бит. Это один крошечный дополнительный шаг в одной из самых фундаментальных и распространенных операций, имеющихся в каждом приложении.

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

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

С помощью вашего метода вам потребуется очистить существующий бит, что является дополнительной операцией в дополнение к заполнению:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

Вам все равно нужно установить эти дополнительные 4 бита в обоих случаях, но в «интуитивном» случае вам также нужно очистить 5-й бит. Это один крошечный дополнительный шаг в одной из самых фундаментальных и распространенных операций, имеющихся в каждом приложении.

В этом случае вам также необходимо очистить 5-й бит. Это один крошечный дополнительный шаг в одной из самых фундаментальных и распространенных операций, имеющихся в каждом приложении.

В этом случае вам также необходимо очистить 5-й бит. Это один крошечный дополнительный шаг в одной из самых фундаментальных и распространенных операций, имеющихся в каждом приложении.

324
ответ дан 23 November 2019 в 05:18
поделиться

Ну, на самом деле вы не собираетесь перевернуть все биты вашего двоичного числа. Фактически это вычитание каждой цифры из 1. Это просто удачное совпадение, что вычитание 1 из 1 дает 0, а вычитание 0 из 1 дает 1. Таким образом, перестановка битов эффективно выполняет это вычитание.

Но почему вы находите разницу между каждой цифрой и единицей? Ну, это не так. Фактическое намерение состоит в том, чтобы вычислить отличие данного двоичного числа от другого двоичного числа, которое имеет такое же количество цифр, но содержит только единицы. Например, если ваше число 10110001, когда вы переворачиваете все эти биты, вы фактически вычисляете (11111111 - 10110001).

Это объясняет первый шаг в вычислении двойного дополнения. Теперь давайте включим второй шаг - добавление 1 - также на картинке.

Добавьте 1 к вышеприведенному двоичному уравнению:

11111111 - 10110001 + 1

Что вы получите? Это:

100000000 - 10110001

Это окончательное уравнение. И, выполнив эти два шага, вы пытаетесь найти вот это, окончательное различие: двоичное число, вычитаемое из другого двоичного числа с одной дополнительной цифрой и содержащее нули, за исключением самой значимой битовой позиции.

Но почему мы так жаждем? после этой разницы действительно? Что ж, с этого момента, думаю, будет лучше, если вы прочтете статью в Википедии .

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

Но почему мы на самом деле стремимся к этой разнице? Что ж, с этого момента, думаю, будет лучше, если вы прочтете статью в Википедии .

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

Но почему мы на самом деле стремимся к этой разнице? Что ж, с этого момента, думаю, будет лучше, если вы прочтете статью в Википедии .

0
ответ дан 23 November 2019 в 05:18
поделиться

Вы можете посмотреть, как профессор Джерри Кейн из Стэнфорда объясняет дополнение двух, во второй лекции (объяснение относительно двух дополнений начинается около 13:00) в серии лекций под названием «Парадигмы программирования», доступных для смотреть на YouTube-канале Стэндфорда. Вот ссылка на серию лекций: http://www.youtube.com/view_play_list?p=9D558D49CA734A02 .

1
ответ дан 23 November 2019 в 05:18
поделиться

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

Если имеется x битов, дополнение до двух будет в диапазоне от + (2 ^ x / 2 + 1) до - (2 ^ х / 2). Дополнение до единицы будет иметь значения от + (2 ^ x / 2) до - (2 ^ x / 2), но допускает отрицательный ноль (0000 равно 1000 в системе дополнения до 1 с 4 битами).

0
ответ дан 23 November 2019 в 05:18
поделиться

Чтобы расширить другие ответы:

В дополнении до двух

  • Сложение - это тот же механизм, что и сложение простых положительных целых чисел.
  • Вычитание тоже не меняется
  • Умножение тоже !

Для деления нужен другой механизм.

Все это верно, потому что дополнение до двух - это обычная модульная арифметика, в которой мы предпочитаем рассматривать некоторые числа как отрицательные путем вычитания по модулю.

4
ответ дан 23 November 2019 в 05:18
поделиться

Обычная реализация операции - это «перевернуть биты и добавить 1», но есть другой способ ее определения, который, вероятно, проясняет логику. Дополнение 2 - это форма, которую вы получите, если возьмете обычное представление без знака, где каждый бит управляет следующей степенью 2, и просто сделайте наиболее значимый член отрицательным.

Принятие 8-битного значения a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0

Обычная беззнаковая двоичная интерпретация:
2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

Дополнительная интерпретация двух символов:
-2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1

Ни один из других битов вообще не меняет значения, и перенос в 7 является «переполнением» и не ожидается, что он будет работать, поэтому практически все арифметические операции работают без изменений (как отмечали другие). Знак-величина обычно проверяет знаковый бит и использует другую логику.

5
ответ дан 23 November 2019 в 05:18
поделиться

Дополнение до двух позволяет суммировать отрицательные и положительные числа без какой-либо специальной логики.

Если вы пытались сложить 1 и -1, используя свой метод
10000001 (-1)
+00000001 (1)
вы получите
10000010 (-2)

Вместо этого, используя дополнение до двух, мы можем добавить

11111111 (-1)
+00000001 (1) вы получите
00000000 (0)

То же самое и с вычитанием.

Кроме того, если вы попытаетесь вычесть 4 из 6 (два положительных числа), вы можете дополнить 2 до 4 и сложить эти два вместе 6 + (-4) = 6 - 4 = 2

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

4
ответ дан 23 November 2019 в 05:18
поделиться

Дополнение до двух позволяет выполнять сложение и вычитание обычным способом (как вы перематываете числа без знака). Это также предотвращает -0 (отдельный способ представления 0, который не был бы равен 0 при обычном побитовом методе сравнения чисел).

8
ответ дан 23 November 2019 в 05:18
поделиться

Википедия говорит все:

Система с дополнением до двух имеет то преимущество, что не требуется, чтобы схемы сложения и вычитания проверяли знаки операндов, чтобы определить, следует ли добавлять или вычесть. Это свойство упрощает реализацию системы и позволяет легко обрабатывать арифметические операции с более высокой точностью. Кроме того, ноль имеет только одно представление, что позволяет избежать тонкостей, связанных с отрицательным нулем, который существует в системах с дополнением до единиц.

Другими словами, сложение одинаково, независимо от того, является ли число отрицательным.

18
ответ дан 23 November 2019 в 05:18
поделиться

, он предназначен для упрощения сумм и разностей чисел.

6
ответ дан 23 November 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: