Как целое число хранится в памяти?
это, скорее всего, самый тупой вопрос, который кто-либо задаст, но независимо от этого я надеюсь, что найду четкий ответ на это.
мой вопрос - как целое число хранится в памяти компьютера?
в 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 1
s перевернуто на 0
и 0
s переворачивается на 1
s) с одним добавленным к нему.
есть две основные причины, по которым это так удобно:
мы сразу знаем, если число положительно отрицательного, глядя на один бит, наиболее бит из
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 и ряд промежуточное значение. Это повышает емкость (каждая ячейка может хранить несколько бит), но это плохая новость для надежности. Этот вид обломока использован в полупроводниковых приводах, и эти работают на очень крае полной ненадежности увеличить емкость.