Нахождение разницы между отрицательным и положительным двоичным числом - PullRequest
0 голосов
/ 08 января 2019

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

Если у нас есть число +13, то его двоичное представление выглядит так: 1101

и его отрицательное представление выглядит так:

11101

Что я понимаю, так это то, что если вам нужно различить их, то присутствие 0 важно в числе +13:

01101

Несмотря на это, я все еще не могу различить:

11101 ///Here is the representation of -13

и

11101 ///Here is the representation of +29

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

Как я могу различить эти два двоичных представления?

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Двоичное значение открыто для кодировки .

1101

1101 2 имеет значение 13 10 , когда нет закодированного знакового бита.

Когда используется бит знака, width N также важен.
Когда N > 4, с использованием дополнения 2 , 1s дополнения , звездная величина , значение по-прежнему 13 10 .

11101

Если 11101 2 было сохранено в unsigned поле размером 5 или более, значение будет 29 10 .

Если 11101 2 было сохранено в 5-битовом поле signed int, значение зависит от кодировки int (которая, безусловно, является дополнением к 2).

2 дополнения: -3 10
1с дополнение: -2 10
Величина знака: -13 10 (по-видимому, начальный вид OP)

0 голосов
/ 08 января 2019

Одна и та же последовательность бит может иметь радикально разные значения в зависимости от контекста.

Целочисленные типы имеют фиксированное количество битов - определение языка C требует, чтобы тип int со знаком должен был представлять не менее диапазон [-32,767...32,767], что означает, что int должно быть не менее 16 бит в ширину 1 .

Существует несколько различных способов представления целых чисел со знаком. Наиболее распространенным является дополнение 2, но некоторые архитектуры могут использовать дополнение 1 или величину знака.

Чтобы отразить знак числа дополнения 2, сделайте побитовое отрицание и добавьте 1 (в этом примере предполагается 8-битные целые числа):

00001101 == 13
11110010 + 1 == 11110011 == -13

11110011 == -13
00001100 + 1 == 00001101 == 13

Одним из главных преимуществ дополнения 2 является то, что у вас есть одно представление для 0, и оно дает вам несколько более широкий диапазон значений - [-2<sup>n-1</sup>..2<sup>n-1</sup>-1]

Чтобы поставить знак на номер дополнения 1, вы просто делаете побитовое отрицание:

00001101 == 13
11110010 == -13

11110010 == -13
00001101 == 13

С дополнением 1 у вас есть положительное и отрицательное представление для 0 - 00000000 и 11111111 - и диапазон составляет [-2<sup>n-1</sup>-1..2<sup>n-1</sup>-1]

При значении знака вы оставляете биты значения как есть и переворачиваете бит знака:

00001101 == 13
10001101 == -13

Как и дополнение 1, вы получаете две кодировки для положительных и отрицательных 0 - 00000000 и 10000000.

Целочисленные типы без знака имеют ту же ширину, что и их знаковые аналоги, а их диапазон равен [0..2<sup>n</sup>-1].

Итак, битовая последовательность 11110011 может означать -13 в дополнении 2, -12 в дополнении 1, -115 в значении знака или 243 без знака.


Обратите внимание, что некоторые архитектуры могут использовать биты заполнения, так что для представления 32 767 требуется более 16 бит.
0 голосов
/ 08 января 2019

Как говорят другие парни, вопрос могу ли я различить эти два двоичных представления как бессмысленные. Последовательность битов нейтральна, когда вы преобразуете ее в число, вы выполняете преобразование для данного представления. Он может представлять int , unsigned int , float или что угодно. Это как если бы я спросил вас, что такое монета , это слово существует (по крайней мере?) На английском и французском языках с совершенно другим значением (французское слово монета означает угловой на английском), чтобы ответить мне, вам нужно выбрать язык, без которого вы не сможете ответить.

Что касается «дополнения двоих», то это способ, совместимый со стандартным представлением, используемым в нашем процессоре, для изменения знака подписанного int . Первое дополнение должно заменить все 0 на 1, а все 1 на 0, Второе дополнение - добавить 1 к предыдущему результату.

Предположим, что слово имеет 5 битов, значение int 13 равно 01101 в двоичном виде. Если мы хотим -13, то первое дополнение на 13 дает 10010, добавляя 1, что дает 10011.

Но все еще с 5-битными словами, 10011 для без знака int соответствуют значению 19.

Для int на 5 битах нижнее отрицательное число по определению 10000, если мы попытаемся изменить его знак: первый комплемент = 01111, добавив 1 = 10000! На самом деле переполнение - 5 битов недостаточно.

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