Как хранятся типы данных в памяти компьютера

Обновлено: 30.06.2024

Представление числовых данных в памяти ЭВМ

Для представления информации в памяти ЭВМ (как числовой, так и не числовой) используется двоичный способ кодирования.

Элементарная ячейка памяти ЭВМ имеет длину 8 бит (байт). Каждый байт имеет свой номер (его называют адресом ). Наибольшую последовательность бит, которую ЭВМ может обрабатывать как единое целое, называют машинным словом . Длина машинного слова зависит от разрядности процессора и может быть равной 16, 32, 64 битам и т.д.

Кодирование символов

Двоично-десятичное кодирование

Представление целых чисел в дополнительном коде

Вообще, разряды нумеруются справа налево, начиная с 0. Ниже показана нумерация бит в двухбайтовом машинном слове.

1514131211109876543210

Дополнительный код положительного числа совпадает с его прямым кодом . Прямой код целого числа может быть получен следующим образом: число переводится в двоичную систему счисления, а затем его двоичную запись слева дополняют таким количеством незначащих нулей, сколько требует тип данных, к которому принадлежит число.

Например, если число 37 (10) = 100101 (2) объявлено величиной типа Integer ( шестнадцатибитовое со знаком ), то его прямым кодом будет 0000000000100101, а если величиной типа LongInt ( тридцатидвухбитовое со знаком ), то его прямой код будет 00000000000000000000000000100101. Для более компактной записи чаще используют шестнадцатеричное представление кода. Полученные коды можно переписать соответственно как 0025 (16) и 00000025 (16) .

Дополнительный код целого отрицательного числа может быть получен по следующему алгоритму:

Например, запишем дополнительный код числа -37, интерпретируя его как величину типа LongInt (тридцатидвухбитовое со знаком):

  1. прямой код числа 37 есть 00000000000000000000000000100101;
  2. инверсный код 11111111111111111111111111011010;
  3. дополнительный код 11111111111111111111111111011011 или FFFFFFDB(16).

При получении числа по его дополнительному коду прежде всего необходимо определить его знак. Если число окажется положительным, то просто перевести его код в десятичную систему счисления. В случае отрицательного числа необходимо выполнить следующий алгоритм:

  1. вычесть из кода числа 1;
  2. инвертировать код;
  3. перевести в десятичную систему счисления. Полученное число записать со знаком минус.

Примеры. Запишем числа, соответствующие дополнительным кодам:

  1. 0000000000010111. Поскольку в старшем разряде записан нуль, то результат будет положительным. Это код числа 23.
  2. 1111111111000000. Здесь записан код отрицательного числа. Исполняем алгоритм: 1) 1111111111000000(2) - 1(2) = 1111111110111111(2); 2) 0000000001000000; 3) 1000000(2) = 64(10).
    Ответ: -64.

Кодирование вещественных чисел

Несколько иной способ применяется для представления в памяти персонального компьютера действительных чисел. Рассмотрим представление величин с плавающей точкой.

Покажем преобразование действительного числа для представления его в памяти ЭВМ на примере величины типа Double.

Как видно из таблицы, величина это типа занимает в памяти 8 байт. На рисунке ниже показано, как здесь представлены поля мантиссы и порядка (нумерация битов осуществляется справа налево):

SСмещенный порядокМантисса
6362..5251..0

Можно заметить, что старший бит, отведенный под мантиссу, имеет номер 51, т.е. мантисса занимает младшие 52 бита. Черта указывает здесь на положение двоичной запятой. Перед запятой должен стоять бит целой части мантиссы, но поскольку она всегда равна 1, здесь данный бит не требуется и соответствующий разряд отсутствует в памяти (но он подразумевается). Значение порядка хранится здесь не как целое число, представленное в дополнительном коде. Для упрощения вычислений и сравнения действительных чисел значение порядка в ЭВМ хранится в виде смещенного числа, т.е. к настоящему значению порядка перед записью его в память прибавляется смещение. Смещение выбирается так, чтобы минимальному значению порядка соответствовал нуль. Например, для типа Double порядок занимает 11 бит и имеет диапазон от 2 -1023 до 2 1023 , поэтому смещение равно 1023(10) = 1111111111(2). Наконец, бит с номером 63 указывает на знак числа.

Таким образом, из вышесказанного вытекает следующий алгоритм для получения представления действительного числа в памяти ЭВМ:

Пример. Запишем код числа -312,3125.

  1. Двоичная запись модуля этого числа имеет вид 100111000,0101.
  2. Имеем 100111000,0101 = 1,001110000101 × 2 8 .
  3. Получаем смещенный порядок 8 + 1023 = 1031. Далее имеем 1031(10) = 10000000111(2).
  4. Окончательно
    1100000001110011100001010000000000000000000000000000000000000000
    6362..5251..0

Очевидно, что более компактно полученный код стоит записать следующим образом: C073850000000000(16).

Другой пример иллюстрирует обратный переход от кода действительного числа к самому числу.

До сих пор мы вели речь только о том, чтобы записать в память некое число . Если у меня есть 5 книг, я записываю в память число 5, и считаю, что сохранил информацию о книгах. Но эта информация относится только к количеству. А что насчет качества? Что насчет синего или красного цвета, или названия книги? Название – это текст, написанный буквами, а как сохранить в памяти буквы?

Ответ везде один и тот же –

В компьютерной памяти хранятся только числа. Никаких букв, никаких красных или синих цветов. Только числа.

Легче не стало? Ничего, сейчас разберемся.

Если количество книг мы смогли представить числом 5, то ничто не мешает представить, например, латинскую букву "A" тоже каким-нибудь числом.

Латинская буква "A" будет обозначаться числом 65 . (Это действительно так, а почему – расскажу позже.)

Итак, чтобы записать в память букву "A", нужно записать число 65. Всё, проблема решена. Присвоены числа и другим буквам: B = 66, C = 67, D = 68 и так далее. Теперь мы можем записать в память любую букву в виде числа.

Если стоит задача сохранить синий цвет, его тоже можно перевести в число. Например, тоже 65 :) Это будет означать, что по шкале от 0 (самый тёмный) до 255 (самый яркий) яркость синего цвета составляет 65.

Таким образом, мы можем сохранить в памяти: 65 как количество чего-нибудь, 65 как букву "A", 65 как яркость синего цвета.

Три абсолютно разных сущности, которые в памяти хранятся как одно и то же число 65. Три абсолютно разных сущности, которые в памяти хранятся как одно и то же число 65.

Если посмотреть на то, что получилось, то мы увидим в памяти просто три байта, и в каждом записано 65 (в двоичном виде 01000001). Но как компьютер понимает, где число, где буква, где цвет?

А это ещё легче. Компьютер ВООБЩЕ НИКАК не понимает, где что. Ему ПЛЕВАТЬ! Для него есть только три числа, записанные в три разных адреса. Кто из них число, кто буква, а кто цвет – известно только нам, и вся ответственность лежит на нас.

Из этого следует одна интересная вещь: в компьютерной памяти мы можем творить любой абсурд. Например, можем сложить букву A и синий цвет. Или сложить число 65 и букву A. Что получится в результате?

65 + A = 130 . Вот это и получится, потому что это всего лишь числа. Компьютеру плевать!

Такие операции с памятью могут быть очень полезны и даже незаменимы (особенно для хакеров), но в основном от программирования требуется обратный эффект – чтобы мы не могли случайно или нарочно сложить цифру с буквой. И языки программирования выступают посредниками между нами и компьютером.

Когда мы пишем на языке программирования, мы заранее объявляем, где у нас число, а где буква, и так далее, и правила языка начинают это всё отслеживать. Мы уже не помещаем свои данные в память напрямую, это делает за нас язык, он как бы ведет учет и знает, где что лежит и как со всем этим обращаться. В большинстве языков программирования существуют следующие типы данных, которые они различают:

  1. Число . Это просто число. Количество книг, температура воздуха и так далее.
  2. Символ . Это один символ вроде буквы "A", или специальный символ типа "%", "@", "$", и т.д. Пробел (" ") тоже считается символом.
  3. Строка . Это любое количество символов, расположенных в памяти подряд друг за другом.

Да-да, чтобы сохранить в памяти строку "Hello world", мы просто подряд, друг за другом, сохраняем символы H,e,l,l,o, ,w,o,r,l,d.

Главная задача компьютерной системы – выполнять программы. Программы вместе с данными, к которым они имеют доступ , в процессе выполнения должны (по крайней мере частично) находиться в оперативной памяти . Операционной системе приходится решать задачу распределения памяти между пользовательскими процессами и компонентами ОС. Эта деятельность называется управлением памятью. Таким образом, память ( storage , memory ) является важнейшим ресурсом, требующим тщательного управления. В недавнем прошлом память была самым дорогим ресурсом.

Часть ОС, которая отвечает за управление памятью , называется менеджером памяти.

Физическая организация памяти компьютера

Запоминающие устройства компьютера разделяют, как минимум, на два уровня: основную (главную, оперативную , физическую ) и вторичную (внешнюю) память.

Основная память представляет собой упорядоченный массив однобайтовых ячеек, каждая из которых имеет свой уникальный адрес (номер). Процессор извлекает команду из основной памяти , декодирует и выполняет ее. Для выполнения команды могут потребоваться обращения еще к нескольким ячейкам основной памяти . Обычно основная память изготавливается с применением полупроводниковых технологий и теряет свое содержимое при отключении питания.

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

Эту схему можно дополнить еще несколькими промежуточными уровнями, как показано на рис. 8.1. Разновидности памяти могут быть объединены в иерархию по убыванию времени доступа, возрастанию цены и увеличению емкости.

Многоуровневую схему используют следующим образом. Информация, которая находится в памяти верхнего уровня, обычно хранится также на уровнях с большими номерами. Если процессор не обнаруживает нужную информацию на i-м уровне, он начинает искать ее на следующих уровнях. Когда нужная информация найдена, она переносится в более быстрые уровни.

Локальность

Оказывается, при таком способе организации по мере снижения скорости доступа к уровню памяти снижается также и частота обращений к нему.

Ключевую роль здесь играет свойство реальных программ, в течение ограниченного отрезка времени способных работать с небольшим набором адресов памяти. Это эмпирически наблюдаемое свойство известно как принцип локальности или локализации обращений.

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

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

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

Логическая память

Аппаратная организация памяти в виде линейного набора ячеек не соответствует представлениям программиста о том, как организовано хранение программ и данных. Большинство программ представляет собой набор модулей, созданных независимо друг от друга. Иногда все модули, входящие в состав процесса, располагаются в памяти один за другим, образуя линейное пространство адресов. Однако чаще модули помещаются в разные области памяти и используются по-разному.

Схема управления памятью, поддерживающая этот взгляд пользователя на то, как хранятся программы и данные, называется сегментацией. Сегмент – область памяти определенного назначения, внутри которой поддерживается линейная адресация. Сегменты содержат процедуры, массивы, стек или скалярные величины , но обычно не содержат информацию смешанного типа.

По-видимому, вначале сегменты памяти появились в связи с необходимостью обобществления процессами фрагментов программного кода (текстовый редактор, тригонометрические библиотеки и т. д.), без чего каждый процесс должен был хранить в своем адресном пространстве дублирующую информацию. Эти отдельные участки памяти, хранящие информацию, которую система отображает в память нескольких процессов, получили название сегментов . Память, таким образом, перестала быть линейной и превратилась в двумерную. Адрес состоит из двух компонентов: номер сегмента , смещение внутри сегмента . Далее оказалось удобным размещать в разных сегментах различные компоненты процесса (код программы, данные, стек и т. д.). Попутно выяснилось, что можно контролировать характер работы с конкретным сегментом , приписав ему атрибуты, например права доступа или типы операций, которые разрешается производить с данными, хранящимися в сегменте .


Рис. 8.2. Расположение сегментов процессов в памяти компьютера

Некоторые сегменты , описывающие адресное пространство процесса, показаны на рис. 8.2. Более подробная информация о типах сегментов имеется в лекции 10.

Большинство современных ОС поддерживают сегментную организацию памяти. В некоторых архитектурах (Intel, например) сегментация поддерживается оборудованием.

Адреса, к которым обращается процесс, таким образом, отличаются от адресов, реально существующих в оперативной памяти . В каждом конкретном случае используемые программой адреса могут быть представлены различными способами. Например, адреса в исходных текстах обычно символические. Компилятор связывает эти символические адреса с перемещаемыми адресами (такими, как n байт от начала модуля). Подобный адрес, сгенерированный программой, обычно называют логическим (в системах с виртуальной памятью он часто называется виртуальным) адресом. Совокупность всех логических адресов называется логическим (виртуальным) адресным пространством .

Связывание адресов

Итак логические и физические адресные пространства ни по организации, ни по размеру не соответствуют друг другу. Максимальный размер логического адресного пространства обычно определяется разрядностью процессора (например, 2 32 ) и в современных системах значительно превышает размер физического адресного пространства . Следовательно, процессор и ОС должны быть способны отобразить ссылки в коде программы в реальные физические адреса, соответствующие текущему расположению программы в основной памяти . Такое отображение адресов называют трансляцией (привязкой) адреса или связыванием адресов (см. рис. 8.3).

Связывание логического адреса, порожденного оператором программы, с физическим должно быть осуществлено до начала выполнения оператора или в момент его выполнения. Таким образом, привязка инструкций и данных к памяти в принципе может быть сделана на следующих шагах [Silberschatz, 2002].

Вы уже владеете одним языком, а быть может и несколькими. Знаете некоторые понятия из химии, физики, математики и других наук. А для того, чтобы понимать и использовать компьютерный язык нужно иметь знания о представлении информации в памяти компьютера. В этой статье поговорим о представлении текста, графики, звука в ПК и рассмотрим основные положения, касающиеся этой темы.

Введение

Для того чтобы было намного проще понять, как представляются файлы в компьютере приведем несколько примеров из жизни с которыми сталкивался каждый:

  1. Вы хотите перейти дорогу, но дойдя до перекрестка, вы останавливаетесь, потому что загорелся красный свет. После небольшого ожидания цвет светофора меняется на зеленый. Машины тормозят, а вы продолжайте свой путь.
  2. Вы сильно торопитесь, когда едете на работу или учебу. Участник дорожного движения, который едет спереди двигается на низкой скорости. Вы моргаете ему фарами, он уступает вам дорогу, и вы едете дальше.

А теперь переведем эти ситуации на язык информатики – в данных ситуациях светофор и фары передают код. Красный сигнал говорит нам о том, что нужно остановиться, а моргание фарами это “код” с помощью которого мы просим уступить дорогу. Быть может вы удивитесь, но в основу любого человеческого языка тоже положен код, только символы в нем называются алфавитом. Теперь рассмотрим это определение более подробно. Итак:

Код – набор обозначений, с помощью которого можно представить информацию.

Кодирование – процесс, при котором данные переводятся в код.

По мере развития информационной сферы учеными и разработчиками предлагались многие способы кодирования информации. Некоторые из них остались незамеченными, другими же мы пользуемся до сих пор. В качестве примера приведем азбуку Морзе, разработанную Самюэлем Морзе в 1849 году. Буквы и цифры определяются в ней тремя символами:

  • Тире (длинный сигнал);
  • Точка (короткий сигнал);
  • Пауза или отсутствие сигнала.

Однако наибольшую популярность завоевал “двоичный код”, который предложил использовать Вильгельм Лейбниц в семнадцатом веке. Информация в нем определяется двумя символами – 0 и 1. Разработчикам данный метод кодирования сильно понравился из-за простоты его реализации. 0- это пропуск сигнала, а число 1- его наличие. Именно двоичное представление используется сегодня в ПК и в другой цифровой технике.

Это интересно Что такое множество 👨‍🎓. Свойства и операции над множествами

Представление и устройство памяти персонального компьютера

Скорее всего, вы знаете, что внутренняя память компьютера состоит из двух частей – оперативной и основной:

Чтобы иметь представление, как работает внутренняя память компьютера, и как её использовать, нужно заглянуть внутрь системного блока. Здесь можно провести аналогию с тетрадным листом “в клеточку”. Каждая клетка содержит в себе одно из двух состояний – 0 или 1. Если в ячейке стоит 1, то это говорит о том, что данная ячейка внутренней памяти включена, если 0, то выключена. Этот способ представления информации называется цифровым кодированием.

Представление памяти пк

Каждая ячейка внутренней памяти ПК хранит в себе единицу информации, которая называется битом. Составляя различные последовательности из битов, мы можем определить различную информацию. У цифрового кодирования много преимуществ – легко копировать и переносить материалы с одного носителя на другой. При создании дубликата копия полностью идентична оригиналу, что невозможно осуществить с данными, которые представлены в аналоговой форме. Из-за большого количества преимуществ в 80-х годах 20 века люди начали использовать способы представления текста, звука и фото с помощью цифр.

Представление графических типов информации в ПК

Сейчас существует два способа представления графических данных в машинном коде.

Растровый

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

Растровое изображение

Векторный

В отличие от растрового кодирования, в данном способе представление графики описывается с помощью векторов. Каждому вектору задают координаты начала и конца, толщину и цвет. Например, для отрисовки окружности надо будет задать координаты её центра и радиус, цвет заполнения (если он есть), а также цвет и толщину контура.

векторное изображение

Текст и числа

Представление текстовой информации во внутренней памяти персонального компьютера осуществляется с помощью специальных таблиц. На данный момент, распространение получили стандарты ASCII и UTF-8

ASCII

Таблица была разработана и стандартизирована в 1963 в США. Она предназначалась для обмена данными по телетайпу. Однако сейчас, с её помощью, можно определить различные буквы, знаки и числа. Один знак в этой таблице кодируется восемью битами.

Стандарт был предложен в 1992 году. Её разработали Кен Томпсон и Роб Пайк. С помощью этой кодировки можно представить все знаки в мире. Обладает большой популярностью в интернете – большинство сервисов и сайтов используют именно это таблицу.

Для записи голоса используется микрофон и звуковая плата компьютера. Чтобы компьютер смог определить звуковую информацию – её необходимо перевести в цифровую. Для этого аналоговый сигнал поступает на аналого-цифровой преобразователь. Там он разбивается на маленькие временные кусочки, каждому из которых устанавливается величина интенсивности голоса.

представление звука в пк

В результате функция A(t) преобразуется в дискретную последовательность. Качество звуковой информации полученной на выходе определяется частотой дискретизации.

Частота дискретизации – количестве измерений уровней громкости за одну секунду. Чем больше это значение, тем лучше качество.

Видео

Заключение

Теперь вы знаете о представлении информации в памяти компьютера. Если разобраться в цифровом кодировании и устройстве внутренней памяти ПК, то вы сможете понять и другие, более серьезные разделы информатики, такие как программирование, IP-адресация и другие. Если у вас возникли вопросы по теме, то задавайте их в комментариях к статье.

Читайте также: