 # Память
 
1. [Память в Swift от 0 до 1](https://habr.com/ru/company/hh/blog/546856/)
2. [Memory Management in Swift: Heaps & Stacks](https://heartbeat.comet.ml/memory-management-in-swift-heaps-stacks-baa755abe16a)
3. [Видео: Как работает память компьютера?](https://www.youtube.com/watch?v=Wh22_O8jXVQ)

### Что такое память?

Память - компонент компьютера, способный хранить в себе различную информацию (программы, картинки, текст и тд). В конечном виде любую информацию мы представляю как двоичное/бинарное число. 

## Байты

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

Байт - минимальная [ячейка (или октет)](https://ru.wikipedia.org/wiki/Октет_(информатика)) память, которая состоит из 8 бит.

![Memory](/pictures/Concurrency/Memory.png?raw=true)   

Поэтому память это также просто длинная последовательность байтов, один за другим уходящих в даль. Но они расположены в определенном порядке. Каждый байт получает число, называемое его адресом (как на примере выше `0x7FFE4A71`). По этому адресу процессор к нему обращается.

#### Виды адресации

Из-за того, что каждый байт имеет адрес, такой вид адресации называется **байтовой**. 

Существуют компьютеры, у которых размер одной ячейки памяти (октета) равняется машинному слову (максимальное кол-во бит, которым процессор может оперировать за раз - обмениваться ими с [ОЗУ (RAM)](../3.1.2%20RandomAccessMemory/3.1.2.1%20RAM.md), хранить их в регистрах). Пример: в 32х битных машинах размер машинного слова будет 32 бита и тд. Такая адресация называется **словесная**.

![TypesOfAddress](/pictures/Concurrency/TypesOfAddress.png?raw=true)

## Расположение байтов

При перессылке информации с одного компьютера на другой было неизвестно в каком порядке передается текст. Для [ASCII](./3.1.1.2%20ASCIIvsUNICODE.md) стандарта такой проблемы нет, тк передается только один байт. 

> !!! Расположение битов внутри байтов всегда неизменно. Меняется расположение только самих байтов.

![Bytes](/pictures//Concurrency/endian.png?raw=true)

* big endian (прямой порядок) - слева направо;

* little endian (обратный порядок) - в большинстве компьютеров байты располагаются справа налево; 

> Apple:
>
>> Both Apple silicon and Intel-based Mac computers use the little-endian format for data, so you don’t need to make endian conversions in your code.


## Стандарты кодировки данных

1. [Как работают кодировки?](https://www.youtube.com/watch?v=4MFcmreAUhs)

* [ASCII](./3.1.1.2%20ASCIIvsUNICODE.md#ASCII) (American standard code for information interchange)

* [Юникод](./3.1.1.2%20ASCIIvsUNICODE.md#Юникод)

## Диапазон данных

| №   | Тип данных                         | Объем памяти | Диапазон значений                              |
| --- | ---------------------------------- | ------------ | ---------------------------------------------- |
| 1   | Int8                               | 1 байт       | от -127 до 127                                 |
| 2   | UInt8                              | 1 байт       | от 0 до 255                                    |
| 3   | Int16                              | 2 байта      | от -32768 до 32767                             |
| 4   | UInt16                             | 2 байта      | от 0 до 65535                                  |
| 5   | Int32 (дефолтный в 32-разрядной)   | 4 байта      | от -2147483648 до 2147483647                   |
| 6   | UInt32                             | 4 байта      | от 0 до 4294967295                             |
| 7   | Int64	(дефолтный в 64  -разрядной) | 8 байт       | от -9223372036854775808 до 9223372036854775807 |
| 8   | Unt64                              | 8 байт       | от 0 до 18446744073709551615                   |
| 9   | Float                              | 4 байта      | от 1.2E-38 до 3.4E+38                          |
| 10  | Double                             | 8 байт       | от 2.3E-308 до 1.7E+308                        |
| 11  | Bool                               | 1 байт       | true/false                                     |
| 12  | String                             | 16 байт      | [ASCII/UNICODE](./3.1.1.2%20ASCIIvsUNICODE.md) |
| 13  | Character                          | 16 байт      | [ASCII/UNICODE](./3.1.1.2%20ASCIIvsUNICODE.md) |

В дополнение фреймворк Core Graphics поддерживает тип `CGFloat`, чей размер зависит от архитектуры и может быть аналогичен либо типу Float, либо типу Double.

## Форматы записи числовых данных

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

* десятичная: числа используются так, как они есть, без каких-либо префиксов

* двоичная: перед числом используется префикс 0b

* восьмеричная: перед числом используется префикс 0o

* шестнадцатеричная: перед числом используется префикс 0x

Например, запишем число 10 во всех системах исчисления:

```swift
let decimalInt = 10
let binaryInt = 0b1010      // 10 в двоичной системе
let octalInt = 0o12         // 10 в восьмеричной системе
let hexInt = 0xA            // 10 в шестнадцатеричной системе
```

---

[3.1.1 About Memory Theme](../3.1.1%20AboutMemory/) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [3.1.1.2 ASCII vs UNICODE Theme](./3.1.1.2%20ASCIIvsUNICODE.md)
