Почему целые числа в Java integer не используют все 32 или 64 бита? - PullRequest
1 голос
/ 04 декабря 2011

Я изучал 32-битные и 64-битные.Я заметил, что диапазон целочисленных значений, которые могут храниться в 32 битах, равен ±4,294,967,295, но Java int также является 32-битным (если я не ошибаюсь) и хранит значения до ±2 147 483 648.То же самое для long, он хранит значения из 0 to ±2^63, но 64-битные хранят значения ±2^64.Почему эти значения отличаются?

Ответы [ 3 ]

5 голосов
/ 05 декабря 2011

Целые числа в Java подписаны , поэтому один бит зарезервирован для представления положительного или отрицательного числа.Представление называется «запись двоичного дополнения». При таком подходе максимальное положительное значение, представленное n битами, задается как

(2 ^ ().n - 1)) - 1

, а соответствующее минимальное отрицательное значение задается как

- (2 ^ ( n - 1))

Аффинный аспект положительных и отрицательных границ обусловлен нулем.Ноль занимает слот, оставляя четное число отрицательных чисел и нечетное число положительных чисел.Если вы представите представленные значения в виде меток на кружке, например, часов на циферблате, вы увидите, что ноль больше относится к положительному диапазону, чем к отрицательному диапазону.Другими словами, если считать ноль в качестве положительного, вы обнаружите больше симметрии в диапазонах положительных и отрицательных значений.

Чтобы изучить это представление, начните с малого.Возьмите, скажем, три бита и запишите все числа, которые можно представить:

  • 0
  • 1
  • 2
  • 3
  • -4
  • -3
  • -2
  • -1

Можете ли вы написать трехбитовую последовательность, которая определяет каждыйиз этих чисел?Как только вы поймете, как это сделать, попробуйте еще раз.Оттуда вы представляете, как он расширяется до 32 или 64 битов.

Эта последовательность образует «колесо», где каждое формируется путем добавления одного к предыдущему, с отмеченным циклом перехода от 3 до -4.Этот эффект обтекания (который также может возникать при вычитании) называется «по модулю арифметики».

2 голосов
/ 04 декабря 2011

В 32 битах вы можете хранить 2 ^ 32 значения.Если вы называете эти значения от 0 до 4294967295 или от -2147483648 до +2147483647, решать вам.Эта разница называется «тип со знаком» и «тип без знака».Язык Java поддерживает только подписанные типы для int.Другие языки имеют разные типы для 32-битного типа без знака.

NO laguage будет иметь 32-битный тип для ± 4294967295, поскольку для части "-" потребуется еще один бит.

0 голосов
/ 04 декабря 2011

Это потому, что Java int s подписаны, поэтому вам нужен один бит для знака.

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