Поговорим про типы данных в языках программирования. Они делятся на две категории: примитивные типы и ссылочные типы. В статье рассмотрим каждую из категорий.
Примитивные типы данных
Примитивные типы данных — это базовые типы данных языка программирования. Их ключевая особенность в том, что данные в них, в отличие от ссылочных типов, располагаются непосредственно [«в переменной».] на участке памяти компьютера в котором находится переменная. Перечислим и опишем основные примитивные типы данных в программировании.
- Логический тип данных или булевый. Переменные данного вида могу принимать лишь два значения: истина (true, либо 1) или ложь (false, либо 0). В различных языках программирования булевы переменные объявляются с помощью ключевого слова bool либо boolean. Логический тип данных имеет широчайшее применение (как собственно и другие типы). Например, он фигурирует в условных операторах ветвления (if) и операторах цикла (for, while, do-while).
- Целочисленный тип данных. Обычно объявляется ключевым словом int или integer. Переменные данного типа могут принимать только целочисленные значения. Часто тип int занимает четыре байта (232 = 4294967296), следовательно переменные могут принимать значения от — 2 147 483 648 и до 2 147 483 647 в случае, когда целый тип учитывает знак числа. Если использовать беззнаковый целый тип данных (unsigned int), то его диапазон значений от 0 до 4294967295. В языке программирования Java целый тип всегда 4 байта. В языках Си и C# предполагаемый размер также 4 байта, но на деле — всё зависит от конкретной реализации языка на программной платформе.
Данный тезис относится не только к типу int. Размер каждого примитивного типа данных в любой реализации языка Java всегда строго определен и одинаков. В C-подобных языках это не так. - Целочисленный тип byte. Исходя из названия типа, он занимает в памяти один байт, то есть восемь бит. 28 = 256 — такое количество значений он может в себя вместить. Если говорить конкретно, то в случае, если тип byte со знаком, то диапазон от -128 до 127 (не забываем, что есть еще число ноль); когда byte беззнаковый, то от 0 до 255.
- Короткий целый тип short. В памяти для него выделено 2 байта = 16 бит (216 = 65536). Диапазон принимаемых значений типом short со знаком — это [-32768; 32767].
- Длинный целый тип long. Длинный целый тип занимает в памяти 8 байт, то есть 64 бита. 264 = 1,8446744 × 1019. Диапазон допустимых значений очень велик: в случае знакового типа, это [-9223372036854775808; 9223372036854775807]. Кроме того, модификатор long можно использовать в сочетании с другими типами (long пишется перед названием типа, например: long double), расширяя, тем самым, диапазон допустимых значений типа согласно спецификации конкретного языка программирования.
- Число с плавающей запятой. Этот тип обозначается ключевым словом float, также же этот тип называют вещественным типом одинарной точности. float — это ни что иное, как десятичная дробь (привычная нам на письме), но в памяти компьютера она представляется в виде экспоненциальной записи: состоит из мантиссы и показателя степени. Например: 0,0506 = 506,0 ⋅ 10-4, где 506 — мантисса, а -4 — показатель степени десяти. Размер типа данных float в спецификации языка Си четко не определен.
- Число с плавающей запятой двойной точности — это тип double. Данный тип схож с типом float, единственное их различие — это размер в памяти и, соответственно, диапазон принимаемых значений. Естественно тип double больше; но всё зависит от реализации языка, говоря строго: тип double по крайней мере должен быть не меньше, чем float.
- Символьный тип данных занимает в памяти один байт — если используется кодировка ASCII и два байта — если установлена кодировка Unicode. Данный тип по сути является целым числом. Цифра, хранящаяся в переменной символьного типа — это номер символа в таблице кодировки. Обычно объявляется с помощью ключевого слова char. Нужно четко представлять себе, что char — это число, и работать с ним, как с числом, в некоторых случаях очень удобно и эффективно.
Ключевая особенность примитивных типов данных в том, что они передаются по значению. Это значит, что при передачи переменной в качестве аргумента функции (или методу) она копируется туда. Следовательно манипуляции, производимые с переменной в вызванной функции, никак не повлияют на значение переменной в вызывающей функции.
Примечание: модификатор unsigned (то есть беззнаковый) применим к любому целочисленному типу (в том числе и к символьному), а long (длинный) применим практически к любому типу, за исключением логического.
Ссылочные типы данных
Самая важная особенность ссылочных типов данных состоит в том, что они передаются не по значению, а по ссылке. Что это значит?
Ссылочные типы данных не являются примитивными и их размер не фиксирован и может быть произвольным, кроме того они хранятся не [«в переменной».] на участке памяти переменной, а в совершенно другом месте памяти компьютера. Ссылочными типами, например, являются массивы. В объектно-ориентированных языках программирования — это экземпляры классов, коллекции и т.п.
При создании нового массива:
1 |
int[] mass = new int[5]; |
Или экземпляра класса:
1 |
StreamWriter sw = new StreamWriter("output.txt"); |
Память в компьютере для созданного объекта выделяется с помощью оператора new (C++, C#, Java), а в переменную объекта (в нашем случае это mass и sw) заносится лишь ссылка на участок памяти (адрес), в котором располагается созданный объект.
Передавая объект в качестве аргумента методу (или функции), в метод передаётся лишь копия адреса, но не копия объекта. Соответственно все изменения и манипуляции, производимые с объектом в вызванном методе, отразятся на объекте в вызывающем методе, потому что это один и тот же объект.
Вот в чём заключается отличие примитивных типов данных от ссылочных.
Поделиться в соц. сетях: