Есть ли в C концепция примитивных типов, и если да, то какие?

Например, java имеет 8 примитивных типов, как задокументировано Oracle.

логическое, байтовое, короткое, символьное, целое, длинное, плавающее, двойное

Похоже, что в C существует много-много типов, но что, если какие-то из них считаются примитивными типами. Пожалуйста, перечислите их для ответа.

Я пытался найти надежную ссылку, похожую на Oracle, но для C, но не смог.

Википедия поддерживает тупой список «основных типов», но я не уверен, что они актуальны.

W3Schools упрощает это и перечисляет «базовые типы», но я также не уверен, что это актуально.

Я собирался сказать: «С имеет хороший небольшой список основных типов, как и Java», но, поразмыслив, эта статья в Википедии, при всей ее сложности, выглядит довольно точной. Обратите внимание, что на практике многие типы в основном являются синонимами друг друга. Например, на подавляющем большинстве обычных машин будет обнаружено, что тип int идентичен либо типу int16_t, либо int32_t, а тип unsigned int идентичен uint16_t или uint32_t.

Steve Summit 03.02.2023 18:29

Что, если мы удалим неподписанные и подписанные части этого списка... что у нас останется?

user18924622 03.02.2023 18:31

У вас остался неполный список типов.

user3386109 03.02.2023 18:31
int и unsigned int определенно разные типы. Есть некоторые упрощения, которые вы, возможно, захотите сделать, но удаление различия по знаку определенно не является одним из них!
Steve Summit 03.02.2023 18:33

Если мы удалим, у нас будет - char, short, int, long, float, double - в качестве основных типов, которые могут быть далее разбиты на другие типы. Интересно, что 8 типов Java содержат все 6 из них, но добавляют... boolean and byte.

user18924622 03.02.2023 18:33

Интересно, какая разница в названии? Какая разница, используется ли слово «основное», «базовое» или «примитивное»?

Eugene Sh. 03.02.2023 18:34

Обратите внимание, что, как и в таблице в статье Википедии, произнесение long или long int — это всего лишь два способа написания одного и того же типа. То же самое с unsigned и unsigned int, и unsigned long и unsigned long int.

Steve Summit 03.02.2023 18:34

Существует как минимум 5 размеров целых чисел: char, short, int, long и long long. (Обычно они не все имеют разные размеры, а в некоторых реализациях их может быть даже больше). Существует как минимум три размера типов с плавающей запятой: float, double и long double, хотя, опять же, может быть некоторое совпадение, т. е. long double может совпадать с double на данной платформе.

Steve Summit 03.02.2023 18:36

Но затем начинают появляться морщины: char странно, потому что он может быть подписанным или беззнаковым, поэтому некоторые говорят, что существует три основных типа символов: char, signed char и unsigned char (причем одна пара или другая идентичны на любой данной платформе). А тут еще bool. А еще есть intmax_t и intptr_t. А еще есть size_t и ptrdiff_t. И этот список можно продолжить... (Приложение: А еще есть wchar_t...)

Steve Summit 03.02.2023 18:38
C добавил логический тип в C99. . А Тип байта Java эквивалентен signed char в C.
user3386109 03.02.2023 18:40

«примитивные типы» не являются терминологией C. В Java это позволяет различать ссылочные типы. Переворачивание вопроса, вероятно, более значимо/полезно - C не имеет Java, подобных ссылочным типам. Глядя на этот список характеристик эталонных типов Java с точки зрения C, я бы ответил примерно так: этого не существует в языке, это не совсем то, как все работает, и это на самом деле не так. иметь значение. Какой бы ни была терминология, существуют существенные различия из-за отсутствия ссылочных типов в стиле Java.

Avi Berger 03.02.2023 19:00

Я подозреваю, что если бы вы заглянули «под капот» в исходный код любого транслятора C (компилятора или интерпретатора), вы бы нашли список «базовых типов», которые вы ищете. В части синтаксического анализатора, отвечающей за разбор имен типов, таких как «long int» и «unsigned char», вы найдете всевозможные довольно сложные сопоставления, но с прилично небольшим набором «базовых типов», выпадающих в конце.

Steve Summit 03.02.2023 19:07

@SteveSummit некоторые говорят, что существует три основных типа символов И что «некоторые» верны, потому что эти «некоторые» включают стандарт C: «Три типа char, signed char и unsigned char вместе называются типами символов ."

Andrew Henle 03.02.2023 20:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
13
196
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ нет, и по 2 причинам.

  1. Понятие примитивных типов в Java существует как противопоставление объектным типам. Это не имеет смысла в C, который не является объектным языком.
  2. C стремится быть максимально эффективным на любой архитектуре, от 16- или даже 8-битных микроконтроллеров до 64-битных платформ. По этой причине тип int обычно выбирается как естественный тип для архитектуры, если он содержит не менее 16 бит. С другой стороны, Jave нацелен на максимальную переносимость и фиксирует размер всех своих типов.

Так что даже если список в Википедии выглядит большим, он (к сожалению...) точен.

Разве char, long, double и т. д. не считаются примитивными типами данных?

GIZ 03.02.2023 19:21

@GIZC не имеет "примитивных" типов. Это слово неприменимо к C. C просто имеет «типы».

Andrew Henle 03.02.2023 20:49

Если список в Википедии выглядит длинным, то это отчасти потому, что Википедия перечисляет несколько альтернативных написаний для многих типов. Это не совсем неточно, но потенциально обманчиво. Например, short не отличается от signed short int.

John Bollinger 04.02.2023 16:28

@andrew - этому стандарту более 10 лет, у вас есть ссылка на более новую версию?

user18924622 04.02.2023 17:33

@bobbywang В настоящее время нет более свежего утвержденного стандарта. C18 просто «устранены дефекты в C11 без добавления новых языковых функций». C23 все еще не утвержден и находится в черновике.

Andrew Henle 04.02.2023 17:57

Таким образом, он был недавно одобрен, он просто не добавляет больше языковых функций.

user18924622 05.02.2023 18:56

Я бы сказал, что в C есть концепция «примитивного» или «базового» типа, но, как мы видели (в вопросе, комментариях и связанной статье Википедии), список этих типов довольно длинный, далеко не такой краткий, как вы могли бы подумать, или как это было во времена K&R.

Мое собственное определение примитивного типа в C, вероятно, неудовлетворительно, «все, из чего вы можете построить производные типы, такие как массив, указатель на, возврат функции и структура, содержащая».

Я почти уверен, что в грамматике стандарта C есть постановления для базовых и производных типов, но у меня нет под рукой моей копии, чтобы проверить.

Текущий список типов C выглядит таким длинным и сложным, потому что он содержит, по причинам разработки программного обеспечения и переносимости, большое количество «псевдонимов», каждый из которых в конечном итоге отображается на какой-то другой тип способом, зависящим от реализации. Например, int32_t обычно совпадает с int или long int, а size_t обычно совпадает с unsigned int или unsigned long int.

Если вы хотите составить краткий список, я думаю, вы начнете с:

  • void
  • bool
  • int довольно многих размеров (включая char и wchar_t)
  • unsigned int довольно много размеров
  • плавающая точка нескольких размеров

И тогда у вас есть набор «символических» типов, таких как size_t, ptrdiff_t и intptr_t, которые обычно сопоставляются с различными типами int или unsigned int способом, определяемым реализацией.

И тогда у вас есть набор типов точного размера, таких как int8_t, int16_t и uint32_t, и все они сопоставляются с другими целочисленными типами способом, определяемым реализацией.

Вы также должны быть осторожны, думая о типах персонажей. Обычный char может быть как подписанным, так и беззнаковым, поэтому вы можете представить, что на самом деле существует три основных типа символов: char, signed char и unsigned char (причем либо char и signed char, либо char и unsigned char идентичны на любой данной платформе). Также есть тип wchar_t с собственным отображением, определяемым реализацией.

В C я привык к тому, что примитивный тип означает одно из двух. Либо это не структура и не массив, либо это не структура и не массив и не указатель, в зависимости от контекста.

Joshua 03.02.2023 18:53

Полный список типов находится в разделе 6.7.2 C11. Это даже длиннее, чем список в Википедии. А еще есть спецификаторы класса хранения, квалификаторы типов и спецификаторы выравнивания. И давайте не будем забывать о битовых полях.

user3386109 03.02.2023 19:10

список этих типов довольно длинный Не совсем так: 1. [un[signed]] char, 2. [un[signed]] short [int], 3. [un[signed]] int, 4. [un[signed]] long [int], 5. [un[signed]] long long [int] 6. float 7. double, 8. long double.

Andrew Henle 03.02.2023 20:53

@AndrewHenle, ты забыл [float/[long] double] _Complex и _Bool

Elzaidir 03.02.2023 21:30

@Elzaidir 6, 7 и 8. _Bool будет реализован как целочисленный тип без знака с ограниченным значением, взятый из 1-5 моего списка, а _Complex является необязательным и фактически представляет собой совокупность двух значений с плавающей запятой, взятых из 6-8. из моего списка.

Andrew Henle 03.02.2023 22:04

Похоже, что в C существует много-много типов, но что, если какие-то из них считаются примитивными типами.

Термин Java «примитивный тип» отличается от ссылочных типов. C не имеет прямого аналога ссылочных типов Java, поэтому нет необходимости проводить такое различие.

Однако C определяет несколько категорий типов, и среди них базовые типы являются достаточно хорошим аналогом примитивных типов Java. В эту категорию входят char, целые типы со знаком и без знака, а также типы с плавающей запятой. В конечном итоге именно из них, перечисляемых типов и типа void получаются все остальные типы, включая типы массивов, типы структур и объединений, типы указателей, атомарные типы и типы функций.

Базовые типы могут включать в себя типы, определенные реализацией, и поэтому не могут быть перечислены исчерпывающе, но те, которые определены спецификацией языка:

char

Стандартные целочисленные типы со знаком
signed char, short int, int, long int, long long int

Стандартные целочисленные типы без знака
_Bool, unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int

Настоящие плавающие типы
float, double, long double

Сложные типы
float _Complex, double _Complex, long double _Complex

Это описано в разделе 6.2.5 спецификации языка.

Следует отметить, что в то время как Java определяет размер и представление своих примитивных типов, C оставляет некоторые из этих деталей своих базовых типов реализациям, накладывая ограничения на их диапазоны представляемых значений и другие свойства без указания точных деталей.

C, кажется, имеет много, много типов

C имеет неограниченное количество типов, так как он предусматривает, что типы могут быть производными от других типов. То же самое относится и к Яве. Игнорируя определяемые реализацией типы расширения, C имеет более чем в два раза больше базовых типов, чем Java имеет примитивные типы, но это все же управляемо, особенно с учетом того, как они организованы.

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

Ответ принят как подходящий

К сожалению, не существует связного набора словарного запаса, который можно было бы распространить на несколько языков.

Примитивные типы Java отличают их от типов объектов или ссылочных типов.

В то время как C имеет много типов, самыми близкими к примитивным типам Java являются основные типы.

Языки делают разные вещи и, следовательно, имеют разные группы для своих типов, и сами типы различны.

Int в C может быть 2 байта для встроенной системы, но в Java это всегда 4 байта.

Другие вопросы по теме