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

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

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

в c# целое число имеет размер 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,и что за соглашение за ним?

4 ответов


он представлен в двоичном формате (база 2). подробнее о number bases. В базе 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-дополнение, которое является дополнением (all 1s перевернуто на 0 и 0s переворачивается на 1s) с одним добавленным к нему.

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

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

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


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

давайте начнем с uint, потому что это немного проще. Конвенции:

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

таким образом, пять будет 00000000000000000000000000000101, потому что 5 = 1 x 20 + 0 x 21 + 1 x 22 + ... остальные-ноль.

Это uint. Конвенция для Интс:

  • вычислить значение uint.
  • если значение больше или равно 0 и строго менее 231 тогда вы закончили. Значения int и uint одинаковы.
  • иначе вычесть 232 из значения uint, и это значение int.

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


Binary работает следующим образом (как ваши 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.


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

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

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

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