Минимальное значение 32-битного целого числа со знаком?

Почему минимальное значение не такое:

11111111 11111111 11111111 11111111

Пожалуйста, помогите мне понять это.


person Chandler's Sexyface    schedule 19.03.2014    source источник
comment
На самом деле довольно ясно, что он спрашивает ..   -  person Maroun    schedule 19.03.2014
comment
en.wikipedia.org/wiki/Two%27s_complement   -  person luser droog    schedule 19.03.2014


Ответы (4)


Давайте использовать 3-битный пример, чтобы все было просто.

Значение 0, представленное в виде 3-битного двоичного числа, равно 000.

Если из 0 вычесть 1, то получится -1. Если мы вычтем 1 из 000, мы получим 111 с заимствованием, которое «отпадает», потому что у нас есть только 3 бита.

Если мы продолжим вычитать 1, мы получим:

-1  111
-2  110
-3  101
-4  100

Если мы вернемся к 0 и добавим 1, мы получим положительные числа:

+1  001
+2  010
+3  011

Но когда мы пытаемся добавить еще один 1, мы получаем представление для -4 вместо +4.

Это похоже на то, что произойдет, если вы попытаетесь отмотать одометр на своем автомобиле. Как только вы достигнете 0, следующим числом будет 9999999 (или столько цифр на одометре), но это, естественно, можно рассматривать как представление -1. По мере того, как вы откатываетесь еще дальше, число будет отдаляться от всех девяток, но будет представлять более отрицательные значения. Можно сказать, что если крайняя левая цифра находится между 0 и 4, то число положительное, а если между 5 и 9, то отрицательное. Продолжая двигаться назад, мы в конечном итоге достигнем 5000000, что является самым отрицательным значением. Повторный откат назад вызывает переполнение, потому что мы получаем 4999999, что мы считаем положительным (наиболее положительное значение). Между прочим, это называется дополнением до 10 и использовалось Чарльзом Бэббиджем для представления отрицательных чисел в его разностной машине.

person pat    schedule 19.03.2014

11111111 11111111 11111111 11111111
↑
MSB is 1 indicating that the number is negative

На самом деле -1. Почему?

Чтобы вычислить дополнение до двух числа, вы переворачиваете все биты и добавляете 1. Выполнение этого на предложенный вами номер даст:

00000000 00000000 00000000 00000001

Что равно 1, но знак отрицательный. Таким образом, вы получаете -1.

Вероятно, вы хотите попробовать:

10000000 00000000 00000000 00000000

Если вы подсчитаете вышеуказанное число, вы получите:

01111111 11111111 11111111 11111111    flip
00000000 00000000 00000000 00000001 +  add 1
-----------------------------------
10000000 00000000 00000000 00000000

Что действительно является минимальным значением.

person Maroun    schedule 19.03.2014
comment
Как насчет систем или арок, которые не используют 2-е дополнение? - person Sadique; 19.03.2014
comment
@ al-Khwārizmī На самом деле я не уверен в этом .. Предпочитаю, чтобы вам ответил кто-то, кто знает. - person Maroun; 19.03.2014
comment
@al-Khwārizmī - поскольку -2 < -1 означает, что 11111111 11111111 11111111 11111111 будет наименьшим отрицательным (а также максимальным положительным) числом, которое может быть представлено в 4 байтах. ... Хотя сам ОП говорит 32-битное число со знаком. - person Grijesh Chauhan; 19.03.2014

Подумайте об этом с точки зрения «значения места» каждого бита. Для экономии места давайте на мгновение рассмотрим 8-битное целое число со знаком, которое может принимать значения от -128 до +127.

Значения места каждого бита в этом целом числе, от наименее до наиболее значимого:

  • +1 (младший разряд)
  • +2
  • +4
  • +8
  • +16
  • +32
  • +64 (старший бит)
  • -128 (знаковый бит)

Это означает, что самое высокое значение представлено как 01111111 (+127), а самое низкое значение представлено как 10000000 (-128). 11111111 представляет -1.

Тот же принцип применим к 32-битным целым числам со знаком, только с большими разрядными значениями (в частности, -2147483648 для бита знака).

person Community    schedule 19.03.2014

В целых числах со знаком старший бит представляет собой знак 1=-ve, 0=+ve.
Таким образом, машина фактически сохраняет их в диапазоне 0x00000000 - 0xffffffff
Но поскольку это signed, он должен включать как положительные, так и отрицательные значения. отрицательное число, и, следовательно, интерпретация изменяет его на [-0x0fffffff + 1, 0x0fffffff] или [0x10000000,0x0fffffff] на языке жестов.

Диапазон равномерно разделен - [-2^31,2^31-1]

person brokenfoot    schedule 19.03.2014