Как узнать, представляет ли двоичное целое число отрицательное число? - PullRequest
21 голосов
/ 17 октября 2011

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

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

Например, -92 имеет 8-битную двоичную форму: 10100100.Но если нам дано 10100100, можем ли мы сказать, что это -92, а не другое неотрицательное число?

Ответы [ 5 ]

17 голосов
/ 17 октября 2011

Конечно, это зависит от представления.В дополнение к двум, которое широко используется, вы просто смотрите на самый значимый бит.

15 голосов
/ 17 октября 2011

Например, (число) -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
6 голосов
/ 17 октября 2011

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

Я перечитал ваш вопрос, и вы сказали, что уже понимаете два дополнения. При работе с отрицательными числами необходимо знать количество бит, чтобы определить, является ли число отрицательным или нет. Отрицательное число должно быть знаком, расширенным до необходимого количества бит. Ваш пример -92 при сохранении в 32 битах будет 11111111111111111111111110100100.

0 голосов
/ 17 июля 2018

Если у вас есть значение в памяти, приведите его к знаку того же размера и проверьте, если оно меньше нуля.Итак, if ((int)value < 0).

Если вы пытаетесь проанализировать двоичную константу из строки, вам нужно знать формат числа.Однако, два дополнения были универсальными в течение пятидесяти лет.(Единственное исключение - бинарно-совместимая поддержка для некоторых старых мэйнфреймов Unisys, которые все еще используются.) Для этого вам просто нужно взглянуть на первый бит (как говорится в принятом ответе).

0 голосов
/ 11 октября 2014

Вам необходимо знать тип (подписанный / без знака) числа, чтобы определить отрицательное / положительное число. Если тип не указан, то по умолчанию он подписан. Если он подписан, вы можете посмотреть бит MSB, чтобы определить положительное или отрицательное нет. Если он упоминается как неподписанный, то нужно считать бит MSB, чтобы сделать десятичное число.

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