Как целое число хранится в памяти?

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

Мой вопрос: как целое число хранится в памяти компьютера?

В С# целое число имеет размер 32 бит. MSDN говорит, что мы можем хранить числа от -2,147,483,648 до 2,147,483,647 внутри целочисленной переменной.

В соответствии с моим пониманием бит может хранить только 2 значения i.e 0 и 1. Если я могу сохранить только 0 или 1 в бит, как я смогу хранить числа от 2 до 9 внутри бит?

Точнее сказать, у меня есть этот код int x = 5; Как это будет отображаться в памяти или, другими словами, как 5 преобразуется в 0 и 1, а что за ним стоит?

Ответ 1

Он представлен в двоичном виде (база 2). Подробнее о числовых базах. В базе 2 вам нужно всего два разных символа для представления числа. Обычно мы используем символы 0 и 1. В нашей обычной базе мы используем 10 разные символы для представления всех чисел, 0, 1, 2,... 8 и 9.

Для сравнения, подумайте о количестве, которое не соответствует нашей обычной системе. Как 14. У нас нет символа на 14, так как мы его представляем? Легко, мы просто объединяем два наших символа 1 и 4. 14 в основании 10 означает 1*10^1 + 4*10^0.

1110 в базе 2 (двоичный) означает 1*2^3 + 1*2^2 + 1*2^1 + 0*2^0 = 8 + 4 + 2 + 0 = 14. Поэтому, несмотря на то, что в базе не было достаточного количества символов для представления 14 с одним символом, мы все равно можем представить его в обеих базовых файлах.

В другом обычно используемом основании, базе 16, который также известен как шестнадцатеричный, мы имеем достаточно символов для представления 14, используя только один из них. Обычно вы видите 14, написанный с использованием символа e в шестнадцатеричном формате.

Для отрицательных целых чисел мы используем удобное представление, называемое twos-дополнением, которое является дополнением (все 1 перевернуты на 0 и все 0 перевернуты до 1 s) с добавленным к нему.

Есть две основные причины, по которым это так удобно:

  • Мы знаем сразу, если число положительно отрицательно, если посмотреть на один бит, самый значительный бит из 32, который мы используем.

  • Он математически корректен в этом x - y = x + -y, используя регулярное добавление так же, как вы учились в начальной школе. Это означает, что процессорам не нужно ничего делать, чтобы реализовать вычитание, если у них уже есть дополнение. Они могут просто найти два дополнения к y (вспомните, переверните биты и добавьте один), а затем добавьте x и y с помощью схемы добавления, которую они уже имеют, вместо того, чтобы иметь специальную схему для вычитания.

Ответ 2

Это не глупый вопрос.

Давайте начнем с uint, потому что это немного легче. Соглашение:

  • У вас есть 32 бит в uint. Каждому биту присваивается число от 0 до 31. По соглашению самый правый бит равен 0, а самый левый бит - 31.
  • Возьмите каждое число бит и поднимите 2 до этой мощности, а затем умножьте его на значение бит. Так что, если бит номер три один, то 1 x 2 3. Если число бит двенадцать равно нулю, то 0 x 2 12.
  • Добавьте все эти числа. Это значение.

Таким образом, пять будет 00000000000000000000000000000101, потому что 5 = 1 x 2 0 + 0 x 2 1 + 1 x 2 2 +.. остальные останутся равными нулю.

Это a uint. Соглашение для ints:

  • Вычислить значение как uint.
  • Если значение больше или равно 0 и строго меньше 2 31 тогда все готово. Значения int и uint одинаковы.
  • В противном случае вычтите 2 32 из значения uint и значение int.

Это может показаться странным соглашением. Мы используем его, потому что получается, что легко создавать чипы, которые выполняют арифметику в этом формате очень быстро.

Ответ 3

Двоичный файл работает следующим образом (как ваши 32 бита).

   1  1  1  1 | 1  1  1  1 | 1  1  1  1 | 1  1  1  1 | 1 1 1 1 | 1 1 1 1 | 1 1 1 1 | 1 1 1 1

2^ 31 30 29 28  27 26 25 24  23 22 21 20  19 18 17 16......................................0
   x

x = знаковый бит (если 1, то отрицательное число, если 0 положительно)

Таким образом, наибольшее число равно 0111111111............ 1 (все, кроме отрицательного), что составляет 2 ^ 30 + 2 ^ 29 + 2 ^ 28 +........ + 2 ^ 1 + 2 ^ 0 или 2 147 483 647.

Самый низкий - 1000000......... 0, что означает -2 ^ 31 или -2147483648.

Ответ 4

Это то, что ведут языки высокого уровня!? EEEK!

Как говорят другие люди, это система подсчета базы 2. Люди в основном основаны на 10 счётчиках, хотя по какой-то причине время составляет основание 60, а 6 x 9 = 42 в основании 13. Алан Тьюринг, по-видимому, был адептом в 17-й психической арифметике.

Компьютеры работают в базе 2, потому что для электроники просто включено или выключено, представляя 1 и 0, что все, что вам нужно для базы 2. Вы могли бы построить электронику таким образом, чтобы она была включена, выключена или где то посередине. Это будет 3 состояния, позволяющие делать третичную математику (в отличие от бинарной математики). Однако надежность снижается, потому что сложнее сказать разницу между этими тремя состояниями, а электроника намного сложнее. Еще больше уровней приводит к ухудшению надежности.

Несмотря на то, что это выполняется в многоуровневой флеш-памяти. В них каждая ячейка памяти представляет собой, выключен и ряд промежуточных значений. Это улучшает емкость (каждая ячейка может хранить несколько бит), но это плохая новость для надежности. Этот чип используется в твердотельных накопителях, и они работают на самом краю полной ненадежности, чтобы максимизировать емкость.