Почему максимальное значение беззнакового n-битного целого числа 2 ^ n-1, а не 2 ^ n? - PullRequest
26 голосов
/ 24 апреля 2011

Максимальное значение n -битного целого числа составляет 2 n -1.Почему у нас "минус 1"?Почему максимум не просто 2 n ?

Ответы [ 12 ]

66 голосов
/ 24 апреля 2011

-1 потому, что целые числа начинаются с 0, но наш отсчет начинается с 1.

Итак, 2^32-1 - это максимальное значение для 32-разрядного целого числа без знака (32 двоичные цифры).2^32 - это число возможных значений .

Чтобы упростить причину, посмотрите на десятичную дробь.10^2-1 - максимальное значение двузначного десятичного числа (99).Поскольку наш интуитивный подсчет людей начинается с 1, а целые числа основаны на 0, 10^2 - это число значений (100).

24 голосов
/ 24 апреля 2011

2^32 в двоичном формате:

1 00000000 00000000 00000000 00000000

2^32 - 1 в двоичном виде:

11111111 11111111 11111111 11111111

Как видите, 2^32 занимает 33 бит, тогда как 2^32 - 1 является максимальным значением 32 битового целого числа.

Причина кажущейся ошибки "off-by-one" в том, что младший бит представляет единицу, а не два.Таким образом, первый бит на самом деле 2^0, второй бит 2^1 и т. Д.

12 голосов
/ 24 апреля 2011

2 32 в двоичном виде - это один, за которым следуют 32 нуля, всего 33 бит. Это не вписывается в 32-битное значение типа int.

8 голосов
/ 24 апреля 2011

В большинстве языков программирования 0 тоже число .

5 голосов
/ 24 апреля 2011

Числа от 0 до N не являются N. Они являются N + 1. Это не очевидно для большинства людей, и в результате многие программы имеют ошибки, потому что по этой причине.

2 голосов
/ 25 мая 2014

Если я спрошу вас, какое наибольшее значение вы можете вписать в двузначное число, вы бы сказали, что это 10 2 (100) или 10 2 -1 (99)?Очевидно последнее.Отсюда следует, что, если я спрошу вас, какое наибольшее n -значное число, это будет 10 n -1.Но почему здесь "-1"?Проще говоря, потому что мы можем представить 0 в двузначном числе также как 00 (но все просто пишут 0).

Давайте заменим 10 произвольной базой, b.Отсюда следует, что для данной базы, b, самое большое n -значное число, которое вы можете представить, это b n -1.Используя 32-битное (n = 32) число base-2 (b = 2), мы видим, что наибольшее значение, которое мы можем представить, 2 32 -1.


Другойспособ думать об этом состоит в использовании меньших чисел.Скажем, у нас есть 1-битное число.Можете ли вы сказать мне, что наибольшее значение, которое он может представлять, составляет 2 1 или 2 1 -1?

2 голосов
/ 24 апреля 2011

Если вы только начинаете программировать, я предлагаю вам взглянуть на эту статью в вики о представлении чисел со знаком

Как сказал Висенте, причина, по которой вы вычитаете 1, заключается в том, что 0 также является включенным числом. В качестве простого примера, с 3 битами вы можете представить следующие неотрицательные целые числа

0 : 000
1 : 001
2 : 010
3 : 011
4 : 100
5 : 101
6 : 110
7 : 111

Все, что находится за этим, требует более 3 цифр. Следовательно, максимальное число, которое вы можете представить, равно 2 ^ 3-1 = 7. Таким образом, вы можете расширить это до любого n и сказать, что вы можете выразить целые числа в диапазоне [0,2^n -1]. Теперь вы можете прочитать эту статью и понять различные формы, а также представить отрицательные целые числа и т. Д.

2 голосов
/ 24 апреля 2011

Это потому, что в вычислениях числа начинаются с 0.Так, если у вас есть, например, 32 адресные строки (2 32 адресуемые байты), они будут в диапазоне [0, 2^32).

1 голос
/ 12 декабря 2014

Потому что 0 также представлен.Количество чисел, которое вы можете представить, действительно равно 2 ^ n с n битами, но максимальное число равно 2 ^ n-1, потому что вы должны начинать отсчет с 0, то есть каждый бит установлен в 0.

Для 1 бита: 0, 1
Для 2 бит: 0, 1, 2, 3
Для 3 бит: 0, 1, 2, 3, 4, 5, 6, 7

И так далее.

1 голос
/ 07 марта 2014

В большинстве языков программирования целое число является значением со знаком (см. дополнение к двум ).

Например, в Java и .NET целое число самый левый байт зарезервирован для знака:

  • 0 => положительное или нулевое число
  • 1 => отрицательное число

Тогда максимальное значение для номера 32-bit ограничено 2^31. И добавив -1 мы получим 2^31 - 1.

Почему появляется -1?

Посмотрите на более простой пример с байтом без знака (8 бит):

  1  1  1  1  1  1  1  1
128 64 32 16  8  4  2  1  <-- the most right bit cannot represent 2
--- --------------------
128 + 127 = 255 

Как отметили другие парни, самый правый бит может иметь максимальное значение 1, а не 2, из-за значений 0/1.

Int32.MaxValue = 2147483647 (.NET)
...