@Lesage

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

Я только начинаю изучать программирование и мне не совсем понятно, как хранятся данные (например, char либо int) в памяти компьютера.
Я говорю не о дополнительном коде или тем, как представлено число в виде 0 и 1. Меня интересует именно как оно хранится на уровне битов.
Допустим, у нас есть число 8 (пусть это будет signed char), которое будет представлено как двоичный код как 0 0001 000 (если я не ошибаюсь)
Число -8 должно быть представлено либо как 1 0001 000 либо как дополнительный код в виде 1 111 1000. С этим связан мой первый вопрос, потому что в учебных материалах все рассматривают какие-то эфемерные понятия "более удобно" и "зачастую используется". Хранятся ли в архитектуре х86 отрицательные числа в дополнительном коде либо же в обычном?

Второй вопрос связан с записью (ну и соответственно чтением) чисел в память. Я знаком с указателями, но все ресурсы говорят что они "ссылаются на ячейку памяти". Что является ячейкой, бит или байт? Если бит, то означает ли это то, что к примеру выделяя память под динамический массив, и создав массив, занимающий с 7 по 39 бит, то биты 0-6 останутся неиспользованными (ведь мы не имеем типов данных, меньших чем 8 бит)? В моём представлении при такой работе с памятью, при очищении и записи по новой она неизбежно будет становится всё более похожей на швейцарский сыр с участками, которые никак не используются
Если же ячейкой памяти являются байт, то как происходит запись числа в него? Последовательная, начиная с 0 и заканчивая 7-ым?
  • Вопрос задан
  • 488 просмотров
Пригласить эксперта
Ответы на вопрос 4
vabka
@vabka
Токсичный шарпист
Хранятся ли в архитектуре х86 отрицательные числа в дополнительном коде либо же в обычном?

Везде в дополнительном коде, тк в таком виде удобнее производить арифметические операции.

Если же ячейкой памяти являются байт, то как происходит запись числа в него? Последовательная, начиная с 0 и заканчивая 7-ым?

В зависимости от архитектуры возможны оба варианта. Читай про LE и BE

Если бит, то означает ли это то, что к примеру выделяя память под динамический массив, и создав массив, занимающий с 7 по 39 бит, то биты 0-6 останутся неиспользованными (ведь мы не имеем типов данных, меньших чем 8 бит)? В моём представлении при такой работе с памятью, при очищении и записи по новой она неизбежно будет становится всё более похожей на швейцарский сыр с участками, которые никак не используются

Проблема фрагментации памяти решается при помощи всяких хитрых аллокаторов и сборщиков мусора.
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev
software engineer
Вопросы нужно структурировать, а то идет поток вопросов, и в голове каша.

Ячейка памяти - это байт.
Запись числа в байт идет сразу, но это может быть даже несколько чисел сразу.
Битность процессора косвенно указывает, сколько байт одновременно может быть обработано

Отрицательные числа - это абстракция для пользователя. С точки зрения процессора, это просто биты.
В языках программирования можно указывать знаковая или беззнаковая переменная, что будет влиять на то, как компилируется код и как он используется.

Например знаковый shortint - это байт, со значениями от 0 до 255
беззнаковый shortint - это байт, со значениями от -127 до +127 (как-то так, может до +128, надо глянуть в вики)

Насчет швейцарского сыра - не мелочитесь, куча памяти всегда остается неиспользованной в современных компьютерах. Например память выделяется страницами, по 64 кбайта, и если процесс не использует их все, другому процессу это все равно использовать нельзя.
Ответ написан
Комментировать
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Что является ячейкой, бит или байт?

Байт
Последовательная, начиная с 0 и заканчивая 7-ым?

Есть архитектура LE (Little Endian) и есть BE (Big Endian). В первой значащие байты хранятся "слева направо", то есть наоборот привычному порядку, во второй - просто по порядку
Ответ написан
Комментировать
hint000
@hint000
у админа три руки
и создав массив, занимающий с 7 по 39 бит, то биты 0-6 останутся неиспользованными (ведь мы не имеем типов данных, меньших чем 8 бит)

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы