Как узнать, представляет ли двоичное целое число отрицательное число?
Я читаю текст на Си. В сеансе "Отрицательные и положительные значения" автор упомянул несколько способов представления отрицательного числа в двоичной форме.
Я все понял, и мне было интересно, если с заданным двоичным числом мы можем определить, является ли оно отрицательным?
Например, -92 имеет 8-битную двоичную форму: 10100100
, Но если нам дать 10100100
Можно ли сказать, что это -92, а не другое неотрицательное число?
5 ответов
Конечно, это зависит от представительства. В дополнении к двум, которое широко используется, вы просто смотрите на самый важный бит.
Например, (число) -92 имеет двоичную форму: 10100100 (в 8-битном байтовом представлении) . Но если нам дано 10100100, можем ли мы сказать, что это -92, а не другое неотрицательное число?
Нет, вам нужно будет заранее знать, использовалось ли хранилище с подписью или без знака для хранения номера, а также вам необходимо знать кодировку, используемую для хранения номера.
Если 8-разрядное целое число (т. Е. Байт) подписано, то, согласно Тому и 32bitkid, целые числа со знаком обычно хранятся в дополнении 2, где старший значащий бит (MSB) будет определять, является ли число отрицательным или нет.
Например, в вашем примере, байт 10100100
может представлять подписанный байт -92
, поскольку:
MSB : 1 means negative
Other 7 Bits 0100100
Flip and add 1 => 1011011 + 1 = 1011100
From powers of two, right to left :
0*2^0 + 0*2^1 + 1*2^2 + 1*2^3 + 1*2^4 + 0*2^5 + 1*2^6
= 4 + 8 + 16 + 64
= 92 (and thus -92 because of the MSB)
ИЛИ, если значение является байтом без знака, то MSB просто рассматривается как следующая степень 2, такая же, как и все младшие биты, т.е. 10100100
может представлять:
(Опять же, полномочия два, справа налево, и опуская 0
полномочия двух)
4 + 32 + 128
= 164
Решение о том, должно ли целое число быть подписано или нет, обычно определяется диапазоном значений, которые необходимо сохранить в нем. Например, 32-разрядное целое число со знаком может представлять диапазон:
–2147483648 to 2147483647
Принимая во внимание, что 32-разрядное целое число без знака может представлять числа из
0 to 4294967295
Вы хотите прочитать о двух дополнительных числах. Короче говоря, самый старший бит может использоваться для определения, является ли число отрицательным.
Я перечитал ваш вопрос, и вы сказали, что уже понимаете два дополнения. При работе с отрицательными числами необходимо знать количество бит, чтобы определить, является ли число отрицательным или нет. Отрицательное число должно быть знаком, расширенным до необходимого количества бит. Ваш пример -92 при сохранении в 32 битах будет 11111111111111111111111110100100.
Вам необходимо знать тип (подписанный / без знака) числа, чтобы определить отрицательное / положительное число. Если тип не указан, то по умолчанию он подписан. Если он подписан, то вы можете посмотреть бит MSB, чтобы определить положительное или отрицательное нет. Если он упоминается как неподписанный, то нужно считать бит MSB, чтобы сделать десятичное число нет.
Если у вас есть значение в памяти, приведите его к знаку того же размера и проверьте, если оно меньше нуля. Так, if ((int)value < 0)
,
Если вы пытаетесь проанализировать двоичную константу из строки, вам нужно знать формат числа. Однако, два дополнения были универсальными в течение пятидесяти лет. (Единственное исключение - двоично-совместимая поддержка для некоторых старых мэйнфреймов Unisys, которые все еще используются.) Для этого вам просто нужно взглянуть на первый бит (как говорится в принятом ответе).