Каков минимальный размер местоположения по адресу в памяти? - PullRequest
0 голосов
/ 29 января 2019

Я только учусь программировать.Мы только что рассмотрели переменные.Нас учили, что они ссылаются на адрес в памяти.Каков размер этого адреса?То есть адрес 13,221 и адрес 13,222 разделены 8 битами?16?32?У каждого отдельного бита есть адрес?

Если размер изменяется, определяется ли конкретный размер аппаратным обеспечением?Формат диска?Операционная система?Компилятор / интерпретатор?

Если я храню только байт данных в 16-битном пространстве, как это реализовано?Делается ли это путем установки по умолчанию крайних левых 8 битов в 0, как, например, запись «12» как «0012» путем сравнения с 10-ю базами?Является ли размер гибким, чтобы использовать эти неиспользуемые куски пространства для хранения?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

адрес 13,221 и адрес 13,222 разделены 8 битами?16?32?

8 бит, почти всегда

У каждого отдельного бита есть адрес?

Нет, только байты.Один использует другие средства для получения значения определенных битов.

Если размер изменяется, определяется ли конкретный размер аппаратным обеспечением?Формат диска?Операционная система?Компилятор / переводчик?

Размер не меняется, и он сильно зависит от оборудования.

Если я храню байт данных только в 16-битном пространстве, как это реализовано?Делается ли это, по умолчанию крайние левые 8 битов равны 0, например, записывая «12» как «0012» путем сравнения с основанием 10?

Я не совсем понимаю, что вы имеете в виду под 16 битамипространство.Если вы рассматриваете 2-байтовую память, каждый байт имеет адрес (как в каждой памяти), а если записан байт, он записывается по адресу, указанному компьютером.Таким образом, в 16-битной памяти есть два байта по адресам 0 и 1.

Но, может быть, вы имели в виду, «если у меня есть адрес 16-битного слова, и я использую его для записи байта, где он будетнаписано?».На самом деле, это зависит от компьютера.В некоторых компьютерах адрес слова является адресом его младшего значащего байта (они называются little endian , а архитектура x86 имеет этот характер), в то время как для других в адресе слова это его самый значимый байт.и наименее значимый - по следующему адресу ( big endian компьютеры).Многие компьютеры могут выбрать endianness во время загрузки.На самом деле, это вопрос соглашения (например, запись справа налево или слева направо), но это имеет глубокие последствия для программирования.Запись байта (char в C) по адресу, который должен содержать 2 байта (short в C), делает программы непереносимыми и настоятельно не рекомендуется, если вы действительно не знаете, что делаете.Если тип данных соблюдается должным образом, вам не нужно беспокоиться о том, как байты расположены в памяти.

Является ли размер гибким для использования этих неиспользуемых кусков пространства хранения?

Компьютеры выделяют пространство для переменных.В зависимости от типа переменной у вас зарезервировано определенное пространство.Например, в C char хранится в байте, short в двух байтах, int в 4 байтах большую часть времени и т. Д. Это гарантирует, что любое значение получит эту переменную, если оно уважаетограничения его типа (например, unsigned char должны быть между 0 и 255), он будет правильно записан в памяти.Так что это не «неиспользованное» пространство.Добавление «гибкости» сделает управление памятью полностью неработоспособным.

0 голосов
/ 29 января 2019

В некоторых аспектах ваш вопрос слишком широк, поскольку структура памяти зависит в первую очередь от аппаратного обеспечения, затем от ограничений операционной системы, затем от компилятора и, наконец, от программного обеспечения, которое вы пишете.На платформе Intel / AMD адрес предназначен для определенного байта.Каждое свидание состоит из 8 бит.Intel и платформы не имеют прямого порядка, поэтому наименьший значащий бит стоит первым.

Регистр является основной «переменной» аппаратного обеспечения.Регистры имеют фиксированный размер.Когда вы сохраняете меньше байтов, чем размер регистра, вам решать, что происходит: используемая вами аппаратная инструкция определяет, будет ли расширен знаковый бит или сбрасываются оставшиеся биты ...

Когда вы сохраняете небольшое число в широкой переменной, компилятор, в соответствии с типом операндов, выберет соответствующие аппаратные инструкции для выполнения того, что вы просили.По этой причине вы можете сохранить байт 5 в переменной int32: компилятор будет использовать инструкцию хранения «byte to byte», которая обнулит все дополнительные 3 байта.

...