Примитивный тип данных - Primitive data type

В информатике , примитивный тип данных либо из следующих условий :

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

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

В зависимости от языка и его реализации примитивные типы данных могут иметь или не иметь однозначное соответствие с объектами в памяти компьютера. Однако обычно ожидается, что операции с базовыми примитивными типами данных будут самыми быстрыми языковыми конструкциями из существующих. Например, сложение целых чисел может выполняться как одна машинная инструкция, а некоторые процессоры предлагают специальные инструкции для обработки последовательностей символов с помощью одной инструкции. В частности, в стандарте C упоминается, что «простой объект типа int имеет естественный размер, предполагаемый архитектурой среды выполнения». Это означает, что intв 32-битной архитектуре он, вероятно, будет иметь длину 32 бита. Базовые примитивные типы почти всегда являются типами-значениями .

Большинство языков не позволяют программам изменять поведение или возможности примитивных (встроенных или базовых) типов данных. Исключения включают Smalltalk , который позволяет расширять все типы данных в программе, добавляя операции, которые могут быть выполнены с ними, или даже переопределяя встроенные операции.

Обзор

Фактический диапазон доступных примитивных типов данных зависит от конкретного используемого языка программирования. Например, в C # , строки являются составным , но встроенными типами данных, в то время как в современных диалектах BASIC и в JavaScript , они приравниваются к типу примитивных данных , который является одновременно основным и встроенным.

Классические базовые примитивные типы могут включать:

Вышеупомянутые примитивы обычно более или менее напрямую поддерживаются аппаратным обеспечением компьютера, за исключением, возможно, операций с плавающей запятой, поэтому операции с такими примитивами обычно довольно эффективны. Некоторые языки программирования поддерживают текстовые строки как примитивы (например, BASIC), в то время как другие обрабатывают текстовую строку как массив символов (например, C). Некоторое компьютерное оборудование (например, x86) имеет инструкции, которые помогают работать с текстовыми строками, но полная аппаратная поддержка текстовых строк встречается редко.

Строки могут быть любой серией символов в используемой кодировке . Чтобы отделить строки от кода, большинство языков заключают их в одинарные или двойные кавычки. Например, «Привет, мир» или «Привет, мир». Обратите внимание, что «200» можно ошибочно принять за целочисленный тип, но на самом деле это строковый тип, поскольку он заключен в двойные кавычки.

Более сложные типы, которые могут быть встроены, включают:

Конкретные примитивные типы данных

Целые числа

Целое число , тип данных представляет некоторый диапазон математических чисел . Целые числа могут быть знаковыми (допускаются отрицательные значения) или беззнаковыми ( только неотрицательные целые числа ). Общие диапазоны:

Размер ( байты ) Размер ( бит ) Имена Подписана диапазон (при условии , двоичное дополнение для подписано ) Беззнаковый диапазон
1 байт 8 бит Байт , октет , минимальный размер charв C99 (см. Limits.h CHAR_BIT) От −128 до +127 От 0 до 255
2 байта 16 бит x86 word , минимальный размер shortи intв C От −32 768 до +32 767 От 0 до 65 535
4 байта 32 бит Двойное слово x86, минимальный размер longв C, фактический размер intдля большинства современных компиляторов C, указатель для процессоров, совместимых с IA-32 От −2 147 483 648 до +2 147 483 647 От 0 до 4 294 967 295
8 байт 64 бит x86 четырехкратное слово, минимальный размер long longв C, фактический размер longдля большинства современных компиляторов C, указатель для x86-64- совместимых процессоров От −9,223,372,036,854,775,808 до +9,223,372,036,854,775,807 От 0 до 18 446 744 073 709 551 615
неограниченно / 8 неограниченный Bignum –2 без ограничений / от 2 до + (2 без ограничений / 2 - 1) От 0 до 2 без ограничений - 1

Литералы для целых чисел могут быть записаны как обычные арабские цифры , состоящие из последовательности цифр и с отрицанием, обозначенным знаком минус перед значением. Однако большинство языков программирования запрещают использование запятых или пробелов для группировки цифр . Примеры целочисленных литералов:

  • 42
  • 10000
  • -233000

Есть несколько альтернативных методов записи целочисленных литералов во многих языках программирования:

  • Большинство языков программирования, особенно те, на которые влияет C , добавляют к целочисленному литералу префикс 0X или 0x для представления шестнадцатеричного значения, например 0xDEADBEEF . Другие языки могут использовать другую нотацию, например, некоторые языки ассемблера добавляют H или h в конец шестнадцатеричного значения.
  • Perl , Ruby , Java , Julia , D , Rust и Python (начиная с версии 3.6) допускают встроенные символы подчеркивания для ясности, например 10_000_000 , а Fortran фиксированной формы игнорирует встроенные пробелы в целочисленных литералах.
  • В C и C ++ начальный ноль указывает восьмеричное значение, например 0755 . Это в первую очередь предназначалось для использования с режимами Unix ; однако его критиковали, потому что нормальные целые числа могут также начинать с нуля. Таким образом, Python , Ruby , Haskell и OCaml префикс восьмеричных значений с 0O или 0o в соответствии с макетом, используемым для шестнадцатеричных значений.
  • Некоторые языки, включая Java , C # , Scala , Python , Ruby и OCaml , могут представлять двоичные значения, добавляя к числу префикс 0B или 0b .

Числа с плавающей запятой

С плавающей точкой число представляет собой ограниченную точность рационального число , которое может иметь дробную часть. Эти числа хранятся внутри в формате, эквивалентном научному представлению , обычно в двоичном, но иногда и в десятичном формате . Поскольку числа с плавающей запятой имеют ограниченную точность, только подмножество действительных или рациональных чисел могут быть точно представлены; остальные числа можно представить только приблизительно.

Многие языки имеют как одинарную точность (часто называемую «float»), так и двойную точность .

Литералы для чисел с плавающей запятой включают десятичную точку и обычно используют e или E для обозначения экспоненциальной записи. Примеры литералов с плавающей запятой:

  • 20,0005
  • 99,9
  • -5000,12
  • 6.02e23

Некоторые языки (например, Fortran , Python , D ) также имеют тип комплексного числа, состоящий из двух чисел с плавающей запятой: действительной части и мнимой части.

Числа с фиксированной точкой

С фиксированной точкой число представляет собой ограниченную точность рационального число , которое может иметь дробную часть. Эти числа хранятся внутри в масштабированной целочисленной форме, обычно в двоичной, но иногда и в десятичной форме . Поскольку числа с фиксированной точкой имеют ограниченную точность, только подмножество действительных или рациональных чисел могут быть точно представлены; остальные числа можно представить только приблизительно. Числа с фиксированной запятой также имеют более ограниченный диапазон значений, чем числа с плавающей запятой , поэтому программист должен быть осторожен, чтобы избежать переполнения в промежуточных вычислениях, а также в конечном результате.

Булевы

Логический тип, как правило , обозначается «BOOL» или «логическое», обычно представляет собой логический тип , который может иметь либо значение «истинный» или значение «ложь». Хотя необходим только один бит для установки значений «истина» и «ложь», языки программирования обычно реализуют логические типы как один или несколько байтов.

Многие языки (например, Java , Pascal и Ada ) реализуют логические значения, придерживаясь концепции boolean как отдельного логического типа. Однако языки могут неявно преобразовывать логические значения в числовые типы время от времени, чтобы придать расширенную семантику логическим значениям и логическим выражениям или для достижения обратной совместимости с более ранними версиями языка. Например, в ранних версиях языка программирования C, следовавших за ANSI C и его прежними стандартами, не было специального логического типа. Вместо этого числовые значения нуля интерпретируются как «ложь», а любое другое значение интерпретируется как «истина». В новом C99 добавлен отдельный логический тип, который может быть включен в stdbool.h , а C ++ поддерживает boolкак встроенный тип, а «true» и «false» - как зарезервированные слова.

Персонажи и строки

Тип символа (обычно называемый «char») может содержать одну букву , цифру , знак препинания , символ , код форматирования, управляющий код или какой-либо другой специализированный код (например, знак порядка байтов ). В C , charопределяется как наименьший адресуемого блока памяти. В большинстве систем это 8 бит ; Некоторые стандарты, такие как POSIX , требуют, чтобы он был такого размера. Некоторые языки имеют два или более типа символов, например однобайтовый тип для символов ASCII и многобайтовый тип для символов Unicode . Термин «символьный тип» обычно используется даже для типов, значения которых более точно представляют единицы кода , например, кодовая единица UTF-16, как в Java (поддержка ограничена только 16-битными символами) и JavaScript .

Символы можно объединять в строки . Строковые данные могут включать числа и другие числовые символы, но обрабатываются как текст. Например, математические операции, которые могут выполняться с числовым значением (например, 200), обычно не могут выполняться с тем же значением, записанным в виде строки (например, «200»).

Строки реализуются по-разному, в зависимости от языка программирования. Самый простой способ реализовать строки - создать их как массив символов, за которым следует символ-разделитель, используемый для обозначения конца строки, обычно NUL . Они называются строками с завершающим нулем и обычно встречаются в языках с низким уровнем аппаратной абстракции , таких как C и Assembly . Несмотря на простоту реализации, строки с завершающим нулем подвергались критике за то, что вызывали переполнение буфера . Большинство языков сценариев высокого уровня, таких как Python , Ruby и многие диалекты BASIC , не имеют отдельного типа символов; строки с длиной, равной единице, обычно используются для представления отдельных символов. Некоторые языки, такие как C ++ и Java , имеют возможность использовать строки с завершающим нулем (обычно для мер обратной совместимости), но дополнительно предоставляют свой собственный класс для обработки строк ( std::stringи java.lang.String, соответственно) в стандартной библиотеке.

Существует также разница в том, являются ли строки изменяемыми или неизменяемыми в языке. Изменяемые строки могут быть изменены после их создания, тогда как неизменяемые строки сохраняют постоянный размер и содержимое. В последнем случае единственный способ изменить строки - создать новые. У каждого подхода есть как преимущества, так и недостатки: хотя неизменяемые строки намного менее гибки, они проще и полностью ориентированы на многопотоковое исполнение . Некоторые примеры языков, использующих изменяемые строки, включают C ++ , Perl и Ruby , тогда как языки, которые не включают JavaScript , Lua , Python и Go . Некоторые языки, такие как Objective-C , предоставляют разные типы для изменяемых и неизменяемых строк.

Литералы для символов и строк обычно заключаются в кавычки : иногда одинарные кавычки ( ' ) используются для символов, а двойные кавычки ( " ) используются для строк. Python принимает любой вариант для своей строковой нотации.

Примеры символьных литералов в синтаксисе C:

Примеры строковых литералов в синтаксисе C:

  • "А"
  • "Привет, мир"
  • «Есть 4 кошки».

Диапазоны числовых типов данных

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

Диапазон переменной основан на количестве байтов, используемых для сохранения значения, а целочисленный тип данных обычно может хранить 2 n значений (где n - количество битов, которые вносят вклад в значение). Для других типов данных (например, значений с плавающей запятой ) диапазон более сложный и будет варьироваться в зависимости от метода, используемого для его хранения. Есть также некоторые типы, которые не используют целые байты, например, логическое значение, которое требует одного бита и представляет двоичное значение (хотя на практике часто используется байт, а остальные 7 бит являются избыточными). Некоторые языки программирования (такие как Ada и Pascal ) также допускают обратное направление, то есть программист определяет диапазон и точность, необходимые для решения данной проблемы, а компилятор автоматически выбирает наиболее подходящий тип целого числа или с плавающей запятой.

Смотрите также

использованная литература

внешние ссылки