Почему минимальное значение не такое:
11111111 11111111 11111111 11111111
Пожалуйста, помогите мне понять это.
Почему минимальное значение не такое:
11111111 11111111 11111111 11111111
Пожалуйста, помогите мне понять это.
Давайте использовать 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 и использовалось Чарльзом Бэббиджем для представления отрицательных чисел в его разностной машине.
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
Что действительно является минимальным значением.
-2 < -1
означает, что 11111111 11111111 11111111 11111111 будет наименьшим отрицательным (а также максимальным положительным) числом, которое может быть представлено в 4 байтах. ... Хотя сам ОП говорит 32-битное число со знаком.
- person Grijesh Chauhan; 19.03.2014
Подумайте об этом с точки зрения «значения места» каждого бита. Для экономии места давайте на мгновение рассмотрим 8-битное целое число со знаком, которое может принимать значения от -128 до +127.
Значения места каждого бита в этом целом числе, от наименее до наиболее значимого:
Это означает, что самое высокое значение представлено как 01111111
(+127), а самое низкое значение представлено как 10000000
(-128). 11111111
представляет -1.
Тот же принцип применим к 32-битным целым числам со знаком, только с большими разрядными значениями (в частности, -2147483648 для бита знака).
В целых числах со знаком старший бит представляет собой знак 1
=-ve
, 0
=+ve
.
Таким образом, машина фактически сохраняет их в диапазоне 0x00000000 - 0xffffffff
Но поскольку это signed
, он должен включать как положительные, так и отрицательные значения. отрицательное число, и, следовательно, интерпретация изменяет его на [-0x0fffffff + 1, 0x0fffffff]
или [0x10000000,0x0fffffff]
на языке жестов.
Диапазон равномерно разделен - [-2^31,2^31-1]