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