Как целое число хранится в памяти?
Это, скорее всего, самый тупой вопрос, который кто-то спросит, но, независимо от того, надеюсь, что найду ясный ответ для этого.
Мой вопрос: как целое число хранится в памяти компьютера?
В С# целое число имеет размер 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 состояния, позволяющие делать третичную математику (в отличие от бинарной математики). Однако надежность снижается, потому что сложнее сказать разницу между этими тремя состояниями, а электроника намного сложнее. Еще больше уровней приводит к ухудшению надежности.
Несмотря на то, что это выполняется в многоуровневой флеш-памяти. В них каждая ячейка памяти представляет собой, выключен и ряд промежуточных значений. Это улучшает емкость (каждая ячейка может хранить несколько бит), но это плохая новость для надежности. Этот чип используется в твердотельных накопителях, и они работают на самом краю полной ненадежности, чтобы максимизировать емкость.