提问人: 提问时间:2/4/2023 最后编辑:jennifer k. 更新时间:2/12/2023 访问量:333
C 有原始类型的概念吗,如果有,它们是什么?
Does C have a concept of primitive types and if so what are they?
问:
例如,Java 有 8 种基元类型,如 Oracle 所记录的那样。
布尔值、字节、短、char、int、long、float、double
C 似乎有很多很多类型,但如果有任何被认为是原始类型的话呢?请列出它们作为答案。
我试图找到一个类似于 Oracle 但适用于 C 的可靠参考,但无法找到。
维基百科维护着一个“主要类型”的钝器列表,但我不确定它们是否相关。
W3Schools 简化了这一点并列出了“基本类型”,但我也不确定这是否相关。
答:
答案是否定的,原因有二。
- Java 中原始类型的概念是通过与对象类型的对立而存在的。这在不是对象语言的 C 语言中是没有意义的。
- C 打算在任何架构上尽可能高效,从 16 位甚至 8 位微控制器到 64 位平台。因此,通常选择该类型作为体系结构的自然类型,前提是它至少包含 16 位。另一方面,Jave 的目标是最大的便携性并修复其所有类型的大小。
int
因此,即使维基百科上的列表看起来很大,它(不幸的是......)也是准确的。
评论
char
long
double
short
signed short int
我想说的是,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
相当多的尺寸- 多种尺寸的浮点
然后你有一组“符号”类型,如 和 和 ,它们通常以实现定义的方式映射到各种 or 类型。size_t
ptrdiff_t
intptr_t
int
unsigned int
然后,你有一组精确大小的类型,如 和 ,它们都以实现定义的方式与其他整数类型映射在一起。int8_t
int16_t
uint32_t
在考虑角色类型时,您还必须小心。Plain 可以是有符号的,也可以是无符号的,因此您可以认为实际上有三种基本字符类型:、 和 (在任何给定平台上,要么 和 ,要么 和 ,要么相同)。还有一种类型具有自己的实现定义映射。char
char
signed char
unsigned char
char
signed char
char
unsigned char
wchar_t
评论
[un[signed]] char
[un[signed]] short [int]
[un[signed]] int
[un[signed]] long [int]
[un[signed]] long long [int]
float
double
long double
_Bool
_Complex
C 似乎有很多很多类型,但如果有任何被认为是原始类型的话呢?
Java 术语“基元类型”与引用类型不同。C 没有 Java 引用类型的直接类比,因此没有必要进行这样的区分。
然而,C 确实定义了几类类型,在这些类型中,基本类型是 Java 原始类型的一个相当好的类比。此类别包括 、有符号和无符号整数类型以及 floating[-point] 类型。最终,所有其他类型都是从这些、枚举类型和类型派生出来的,包括数组类型、结构和联合类型、指针类型、原子类型和函数类型。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 具有无限数量的类型,因为它提供了从其他类型派生的类型。这同样适用于 Java。忽略实现定义的扩展类型,C 的基本类型是 Java 原始类型的两倍多,但这仍然是可管理的,尤其是考虑到它们的组织方式。
但是,C 还具有定义类型别名的机制,以及一整套标准类型别名,这些可以使类型看起来比实际存在更多。
不幸的是,没有一套有凝聚力的词汇可以扩展到多种语言。
Java 的基元类型将它们与对象类型或引用类型区分开来。
虽然 C 有很多类型,但最接近 Java 原始类型的是主要类型。
这些语言做不同的事情,因此它们的类型有不同的分组,类型本身也不同。
对于嵌入式系统,C 语言中的 int 可能是 2 个字节,但在 Java 中它始终是 4 个字节。
评论
int
int16_t
int32_t
unsigned int
uint16_t
uint32_t
char, short, int, long, float, double
boolean and byte
signed char