Ответ 1
Это, конечно, зависит от представления. В двух дополнениях, которые широко используются, вы просто смотрите на самый значительный бит.
Я читаю текст на Си. В сеансе "Отрицательные и положительные значения" автор упомянул несколько способов представления отрицательного числа в двоичной форме.
Я все понял, и мне было интересно, если с заданным двоичным числом мы можем определить, является ли оно отрицательным?
Например, -92 имеет 8-битную двоичную форму: 10100100
. Но если нам дается 10100100
можем ли мы сказать, что это -92, а не другое неотрицательное число?
Это, конечно, зависит от представления. В двух дополнениях, которые широко используются, вы просто смотрите на самый значительный бит.
Например, (число) -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
может представлять:
4 + 32 + 128
= 164
(опять же, степени двух, справа налево, и опуская 0
степеней двух)
Решение о том, должно ли целое число быть подписано или нет, обычно определяется диапазоном значений, которые необходимо сохранить в нем. Например, 32-разрядное целое число со знаком может представлять диапазон:
–2147483648 to 2147483647
Принимая во внимание, что 32-разрядное целое число без знака может представлять числа из
0 to 4294967295
Вы хотите прочитать два дополнительных номера. Короче говоря, самый старший бит может быть использован для определения отрицательного числа.
Я перечитал ваш вопрос, и вы сказали, что уже понимаете два дополнения. При работе с отрицательными числами необходимо знать количество бит, чтобы определить, является ли число отрицательным или нет. Отрицательное число должно быть увеличено до необходимого количества бит. Ваш пример -92 при сохранении в 32 битах будет 11111111111111111111111110100100.
Чтобы определить отрицательное/положительное число, вам необходимо знать тип (подписанный/неподписанный) номера. Если тип не указан, то по умолчанию он подписан. Если он подписан, вы можете посмотреть бит MSB для определения положительного или отрицательного значения. Если он упоминается как unsigned, вы должны подсчитать бит MSB, чтобы сделать десятичное число.
Если у вас есть значение в памяти, приведите его к знаку того же размера и проверьте, что оно меньше нуля. Итак, if ((int)value < 0)
.
Если вы пытаетесь проанализировать двоичную константу из строки, вам нужно знать формат числа. Тем не менее, два дополнения было универсальным в течение пятидесяти лет. (Единственное исключение - бинарно-совместимая поддержка для некоторых старых мэйнфреймов Unisys, которые все еще используются.) Для этого вам просто нужно взглянуть на первый бит (как говорится в принятом ответе).