Почему максимальное значение Int32 равно 0x7FFFFFFFF?

Я видел в документах MSDN, что максимальное значение Int32 равно 2,147,483,647, шестнадцатеричное 0x7FFFFFFF.

Я думаю, что если это Int32, он должен хранить 32-битные целые значения, которые, наконец, должны быть 4,294,967,295 и шестнадцатеричными 0xFFFFFFFF.

Мой вопрос: почему Int32 хранит 31-битные целые значения?


person Afshin Mehrabani    schedule 05.11.2012    source источник


Ответы (6)


Это потому, что это целое число со знаком. 32-битное целое число без знака дает вам ожидаемое значение.

Посетите эту страницу MSDN — http://msdn.microsoft.com/en-us/library/exx3b86w(v=vs.80).aspx

Для более подробного объяснения того, почему это так, ознакомьтесь со ссылкой в ​​ответе Джексона Поупса, связанной с представлением числа Two's Complement.

Также некоторые дополнительные материалы.

person Lloyd    schedule 05.11.2012
comment
int32 — это двойное число комплимента, поэтому было бы не совсем справедливо сказать, что верхний бит — это бит знака. Это будет номер комплимента. - person Servy; 25.02.2014
comment
@Servy, однако, его обычно так называют. Это вводит в заблуждение, но что мы можем сделать? - person harold; 25.02.2014
comment
@harold Не вводите в заблуждение и вместо этого сделайте правильное утверждение. - person Servy; 25.02.2014
comment
@Servy, но это правильно, просто вводит в заблуждение. Этот бит на самом деле называется битом знака, несмотря на то, что это название вводит в заблуждение. - person harold; 25.02.2014
comment
@harold Итак, пусть это не вводит в заблуждение. - person Servy; 25.02.2014
comment
@Servy, звучит как хороший план, но, к сожалению, его невозможно выполнить. Биту было дано вводящее в заблуждение имя, и мы не можем изменить ни имя, ни его вводящее в заблуждение. - person harold; 25.02.2014
comment
@harold Но вы можете полностью не использовать этот термин, учитывая, что он вводит в заблуждение. Это даже не сложно сделать. - person Servy; 25.02.2014
comment
давайте продолжим это обсуждение в чате - person harold; 25.02.2014
comment
утверждение, что один бит ИСПОЛЬЗУЕТСЯ для хранения знака, вводит в заблуждение. Эта функция естественным образом возникает из представления дополнения до двух, которое является фактическим внутренним представлением для Int32 в C#. Таким образом, ни один бит фактически не использовался в качестве бита знака, он просто появляется автоматически как хороший побочный эффект представления дополнения до двух. Когда я говорю естественно, я имею в виду, что двоичные сложения и вычитания работают из коробки без какого-либо специального кода для бита знака. Пожалуйста, @JonSkeet, спаси нас здесь!!! :-) - person Gianluca Ghettini; 09.09.2015
comment
Я согласен, когда вы вычитаете 2 из 1, вы получаете -1, но в Int это -1, а шестнадцатеричное представление не 0x80000001, а 0xFFFFFFFF ... это то, что @Servy пытается вам сказать. Существует большая разница между использованием MSB только в качестве знака и наличием числа с двумя комплиментами. Крутая вещь в 2-compliment заключается в том, что вы просто компенсируете ноль на половину размера максимального значения, и вся математика по-прежнему работает, как и ожидалось, с целыми числами без знака. - person BerggreenDK; 11.09.2015

Потому что для хранения знака используется один бит (Int32 может быть меньше нуля).

http://en.wikipedia.org/wiki/Two%27s_complement

person Jackson Pope    schedule 05.11.2012
comment
такого знакового бита нет. Фактическим представлением является дополнение до двух. у двойников и с плавающей запятой (IEEE) это есть. - person Gianluca Ghettini; 09.09.2015

Int32 и Int64 подписаны, поэтому они могут обрабатывать целые значения от -capacity/2 до (capacity/2)-1 (для нуля), поэтому максимальное значение не соответствует ожидаемому. Но вы можете получить то, что хотите, используя unsigned int, чтобы иметь только положительные числа.

person marcnc27    schedule 05.11.2012

Первый бит - это знак - int32 подписан, т.е. он может быть положительным/отрицательным (ну, наверное, я не должен говорить "первый" бит!)

person Charleh    schedule 05.11.2012

Вы не рассматриваете отрицательные числа. Int32 есть знак.

Из MSDN: http://msdn.microsoft.com/en-us/library/system.int32.minvalue.aspx MinValue равно -2,147,483,648; то есть шестнадцатеричное 0x80000000.

person 888    schedule 05.11.2012

В n-битном типе со знаком дополнения до 2 диапазон составляет от -2n-1 до 2n-1-1, потому что с n битами вы можете представить 2n разных значений, половина из которых используется для чисел со знаком из-за знакового бита. Оставшаяся половина 2n-1 используется для неотрицательных чисел. Поскольку единица используется для 0, остается только 2n-1-1 оставшихся значений для положительных чисел.

person phuclv    schedule 30.05.2014