Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

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

Обзор [ править ]

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

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

  • Символ ( character, char);
  • Целое число ( integer, int, short, long, byte) с различными точностей ;
  • Число с плавающей точкой ( float, double, real, double precision);
  • Число с фиксированной точкой ( fixed) с различной точностью и масштабом, выбранным программистом .
  • Логические , логические значения true и false .
  • Ссылка (также называемый указателем или ручкой или дескриптором ), значение со ссылкой на другой объект. Ссылка может быть адресом памяти или индексом набора значений.
Вышеупомянутые примитивы обычно более или менее напрямую поддерживаются компьютерным оборудованием, за исключением, возможно, операций с плавающей запятой, поэтому операции с такими примитивами обычно довольно эффективны. Некоторые языки программирования поддерживают текстовые строки как примитивы (например, BASIC), в то время как другие обрабатывают текстовую строку как массив символов (например, C). Некоторое компьютерное оборудование (например, x86) имеет инструкции, которые помогают работать с текстовыми строками, но полная аппаратная поддержка текстовых строк встречается редко.

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

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

  • Кортеж в стандартном ML , Python , Scala , Swift , Elixir
  • Список в Common Lisp , Python , Scheme , Haskell
  • Комплексное число в C99 , Fortran , Common Lisp , Python , D , Go
  • Рациональное число в Common Lisp , Haskell
  • Ассоциативный массив в Perl , PHP , Python , Ruby , JavaScript , Lua , D , Go
  • Первоклассная функция на всех функциональных языках, JavaScript , Lua , D , Go и в новых стандартах C ++ , Java , C # , Perl

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

Целые числа [ править ]

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

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

  • 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 ; однако его критиковали, потому что нормальные целые числа могут также начинать с нуля. [4] Таким образом, 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 и его прежними стандартами, не было специального логического типа. Вместо этого числовые значения нуля интерпретируются как «ложь», а любое другое значение интерпретируется как «истина». [5] Более новый C99добавлен отдельный логический тип, который может быть включен в stdbool.h , [6] и C ++ поддерживает boolкак встроенный тип, а «true» и «false» - как зарезервированные слова. [7]

Символы и строки [ править ]

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

  • 'А'
  • '4'
  • '$'
  • '\ t' ( символ табуляции )

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

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

Диапазоны числовых типов данных [ править ]

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

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

См. Также [ править ]

  • Язык примитивный
  • Список структур данных § Типы данных
  • Тип объекта
  • Примитивный класс-оболочка
  • Переменная (информатика)

Ссылки [ править ]

  1. ^ «Примитивные типы данных (Учебники Java ™> Изучение языка Java> Основы языка)» . docs.oracle.com . Проверено 1 мая 2020 .
  2. ^ «Типы данных в C» . GeeksforGeeks . 2015-06-30 . Проверено 1 мая 2020 .
  3. ^ a b Туман, Агнер (16 февраля 2010 г.). «Соглашения о вызовах для различных компиляторов C ++ и операционных систем: Глава 3, Представление данных» (PDF) . Проверено 30 августа 2010 .
  4. ^ Черновик 6-го издания ECMAScript: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-numeric-literals. Архивировано 16 декабря 2013 г. на Wayback Machine.
  5. ^ Керниган, Брайан В ; Ричи, Деннис М (1978). Язык программирования C (1-е изд.). Энглвуд Клиффс, Нью-Джерси : Prentice Hall . п. 41 . ISBN 0-13-110163-3.
  6. ^ "Библиотека поддержки логического типа" . devdocs.io . Проверено 15 октября, 2020 .
  7. ^ "Тип данных Bool в C ++" . GeeksforGeeks . Проверено 15 октября, 2020 .
  8. ^ Мансур, Умер. «Тип char в Java сломан» . CodeAhoy . Дата обращения 10 февраля 2020 .

Внешние ссылки [ править ]

  • СМИ, связанные с примитивными типами на Викискладе?