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

 Я только начинаю изучать программирование и мне не совсем понятно, как хранятся данные (например, 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-ым? 

> Хранятся ли в архитектуре х86 отрицательные числа в дополнительном коде либо же в обычном?

  

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

  

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

  

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

  

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

  

Проблема фрагментации памяти решается при помощи всяких хитрых аллокаторов и сборщиков мусора. 

 Вопросы нужно структурировать, а то идет поток вопросов, и в голове каша.  

  

Ячейка памяти - это байт.  

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

Битность процессора косвенно указывает, сколько байт одновременно может быть обработано  

  

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

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

  

Например знаковый shortint - это байт, со значениями от 0 до 255  

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

  

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

> Что является ячейкой, бит или байт?

  

Байт  

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

  

Есть архитектура LE (Little Endian) и есть BE (Big Endian). В первой значащие байты хранятся "слева направо", то есть наоборот привычному порядку, во второй - просто по порядку 

> и создав массив, занимающий с 7 по 39 бит, то биты 0-6 останутся неиспользованными (ведь мы не имеем типов данных, меньших чем 8 бит)

  

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