2016-05-17 2 views
2

Я понимаю, как работает бинарный файл, и я могу вычислить двоичное число до десятичного, но я потерялся вокруг подписанных чисел. Я нашел calculator, который делает преобразование. Но я не уверен, как найти максимальный и минимальный номер или преобразовать, если двоичное число не задано, а вопрос в StackO, похоже, связан с преобразованием определенных чисел или не содержит подписанных номеров для определенного бита.Какое наивысшее и наименьшее целое число для представления подписанных чисел в двух дополнениях в 5 бит?

Конкретный вопрос:

We have only 5 bits for representing signed numbers in two's complement: 

What is the highest signed integer? 
Write its decimal value (including the sign only if negative). 

What is the lowest signed integer? 
Write its decimal value (including the sign only if negative). 

Похоже, мне придется идти тяжелее бинарных понятий, я просто 2 месяца в программировании, и я думал, что я знал о двоичном преобразовании.

ответ

5

С логической точки зрения:

Bounds в подписанном представлении

У вас есть 5 битов, поэтому существует 32 различных комбинаций. Это означает, что вы можете сделать 32 разных номера с 5 битами. В целых числах без знака имеет смысл хранить целые числа от 0 до 31 (включительно) на 5 бит.

Однако речь идет о целых числах без знака. Смысл: мы должны найти способ представления отрицательных чисел. Значение: нам нужно сохранить значение числа, но также его знак (+ или -). Используемое представление является дополнением 2, и это тот, который изучается повсюду (может быть, другие существуют, но я их не знаю). В этом представлении знак задается первым битом. То есть, в представлении комплемента 2 положительное число начинается с 0, а отрицательное число начинается с 1.

И вот проблема встает: есть 0 положительное число или отрицательное число? Это не может быть так, потому что это означает, что 0 может быть представлено двумя способами для заданного числа бит (для 5: 00000 и 10000), то есть мы теряем пространство, чтобы поставить еще одно число. Я понятия не имею, как они решили, но факт 0 - это положительное число. Для любого количества бит, подписанных или без знака, a 0 представляется только 0.

Отлично. Это дает нам ответ на первый вопрос: какова верхняя граница десятичного числа, представленного в дополнении 2? Мы знаем, что первый бит для знака, поэтому все числа, которые мы можем представить, должны состоять из 4 бит. Мы можем иметь 16 различных значений 4-битовых строк, а 0 - один из них, поэтому верхняя граница равна 15.

Теперь, для отрицательных чисел это становится легко. Мы уже заполнили 16 значений из 32, которые мы можем сделать на 5 бит. 16 слева. Мы также знаем, что 0 уже представлено, поэтому нам не нужно его включать. Затем мы начинаем с числа перед 0: -1. Поскольку у нас есть 16 чисел для представления, начиная с -1, наименьшее знаковое целое число, которое мы можем представить на 5 бит, равно -16.

В целом, с n битами мы можем представить 2^n номеров. Со знаком целых чисел половина из них положительна, а половина из них отрицательна. То есть у нас есть 2^(n-1) положительных чисел и 2^(n-1) отрицательные числа. Как мы знаем, 0 считается положительным, наибольшее целое число со знаком, мы можем представить на n битов 2^(n-1) - 1 и самая низкая -2^(n-1)

2 дополнением представление

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

Мы уже видели, что знак представлен на первом бите и что 0 считается положительным. Для положительных чисел он работает так же, как и для целых чисел без знака: 00000 равен 0, 00001 равен 1, 00010 равен 2 и т. Д. До 01111, что равно 15. Здесь мы останавливаемся на положительные целые числа, потому что мы заняли все 16 значений, которые у нас были.

Для отрицательных целых чисел, это разные. Если мы сохраняем одно и то же представление (10001 равно -1, 10010 равно -2, ...), тогда мы получим 11111, равный -15 и 10000, которые не будут отнесены. Мы могли бы сказать, что это -16, но мы должны были бы проверять этот конкретный случай каждый раз, когда мы работаем с отрицательными целыми числами. Кроме того, это испортит все двоичные операции. Мы могли бы также решить, что 10000 -1, 10001 -2, 10010 - -3 и т. Д. Но это также испортит все двоичные операции.

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

  1. Раскладные все биты: 10011 -> 01100
  2. Добавить 1: 01100 -> 01101
  3. Читай, как целое число без знака: 01101 = 0 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 13.

10011 представляет -13. Это представление очень удобно, потому что оно работает в обоих направлениях. Как представить -7 как двоичное целое число со знаком? Начните с двоичным представлением 7, который является 00111.

  1. Флип все биты: 00111 -> 11000
  2. Добавить 1: 11000 -> 11001

И вот оно! На 5 бит, -7 представлен 11001.

Я не буду его покрывать, но еще одно большое преимущество с дополнением 2 заключается в том, что сложение работает одинаково. То есть, при добавлении двух двоичных чисел вам не нужно заботиться о том, подписаны они или нет, это тот же самый алгоритм.

С этим вы должны быть в состоянии ответить на вопросы, но что еще более важно, чтобы понять ответы.

Эта тема отлично подходит для понимания дополнения до 2: Why is two's complement used to represent negative numbers?

+0

Очень приятно. Предложение «Сдвиг всех бит» можно смутить с помощью операций с левым или правым сдвигом. Возможно, флип, или Википедия использует инвертирование. – foo

Смежные вопросы