В этом разделе мы поговорим о том, как различные элементы программы сохраняются в памяти PC. Поскольку данное пособие посвящено Котлину как JVM-языку, они сохраняются в памяти JVM как виртуального компьютера. Тем не менее, организация памяти JVM имеет немало общего с организацией памяти настоящего компьютера. Поговорим об этом подробнее.
Биты, байты и килобайты
Единицей измерения информации (например, хранящейся в памяти или на диске) является бит — элементарная ячейка, имеющая всего два состояния (0 и 1, либо true и false). Биты объединяеются в байты — в одном байте 23 = 8 бит. Байты, в свою очередь, объединяются в килобайты (Кб) — в одном килобайте 210 = 1024 байт. Обратите внимание — не 1000 байт, а именно 1024 байт, поскольку компьютеру удобнее, чтобы данные размерности были степенями двойки. В свою очередь, в одном мегабайте (Мб) 1024 Кб, в одном гигабайте (Гб) 1024 Мб, в одном терабайте (Тб) 1024 Гб.
Системы счисления
При хранении чисел в компьютере используется не привычная человеку десятичная система счисления, а более удобная для компьютера двоичная система. При этом используется всего две цифры: 0 и 1. К примеру, число 75 в двоичной системе представляется как 1001011 = 1 х 64 + 0 х 32 + 0 х 16 + 1 x 8 + 0 x 4 + 1 x 2 + 1 x 1
.
Поскольку двоичная запись числа является очень длинной, иногда (для удобства связи между человеком и компьютером) программисты применяют восьмеричную системму счисления (в ней восемь цифр от 0 до 7) и шестнадцатеричную систему счисления (в ней, помимо традиционных цифр от 0 до 9, используются цифры a = 10, b = 11, c = 12, d = 13, e = 14, f = 15). Удобство состоит в том, что одной восьмеричной цифре соответствует ровно три двоичных — к примеру, 5 = 101, а одной шестнадцатеричной — ровно четыре двоичных, к примеру, b = 1011. 75 представляется как 113 в восьмеричной и как 4b в двоичной системе счисления.
Шестнадцатеричную константу в Котлине можно записать с префиксом 0x
: к примеру, 0x4b
. Восьмеричные константы в Котлине не поддерживаются, а двоичные начинаются с префикса 0b
: к примеру, 0b1001011
. Подробнее о системах счисления и способах перевода чисел из одной системы в другую можно прочитать в статьях Википедии «Система счисления» и «Позиционная система счисления».
Целые числа
Целые числа типа Int занимают в памяти четыре байта, или 32 бита, при хранении используется двоичная система счисления. Модуль числа занимает 31 бит из 32, старший бит занимает знак (он равен 0 для положительных и -1 для отрицательных чисел). Модуль положительных чисел хранится обычным образом, а отрицательных — в так называемом дополнительном коде. При этом вместо модуля числа |x|
в памяти хранится значение 231 - |x|
, например, 231 - 1
для числа -1
или 0
для числа -231
. Использование дополнительного кода позволяет упростить операции сложения и вычитания чисел для компьютера.
Помимо типа Int, в Котлине имеется ещё три целочисленных типа, а именно:
- Byte — целое число от -128 до 127, занимает один байт;
- Short — целое число от -32768 до 32767, занимает два байта;
- Long — целое число от
-263
до263 - 1
, занимает восемь байт.
Подобные целые числа устроены по тому же принципу, что и числа типа Int. Следует иметь в виду, что при работе с типом Long нельзя использовать литералы типа Int:
val long1: Long = 42 // Error! val long2: Long = 42L // OK!
Вместо них используются литералы типа Long с суффиксом L
.
Как правило, в программах используется именно тип Int для хранения целых чисел. Исключения составляют следующие случаи:
- когда диапазон типа Int недостаточен для целей программы, следует использовать Long;
- когда требуется сохранить большое (измеряемое, минимум, десятками тысяч) количество чисел с маленьким диапазоном — следует использовать Byte или Short для экономии памяти.