';int';和';char';在C编程语言中定义的类型?

';int';和';char';在C编程语言中定义的类型?,c,gcc,C,Gcc,我正在学习C语言是如何工作的。我可以在中找到诸如int8\u t、intptr\u t等类型的定义: 但是,我找不到类型的定义,比如char。因此,我的问题是,在哪里定义了int和char呢?在哪个头文件中定义了char? 无处-char是内置类型,而不是用户定义的类型。它是核心语言的一部分。这同样适用于int 所有这些内置类型都没有定义吗? 有。该标准没有定义这些内置类型 请注意,char和int也都是关键字,这意味着您不能将它们用作标识符,因为它们在语言中有保留和已分配的用法 因此,我的问

我正在学习C语言是如何工作的。我可以在
中找到诸如
int8\u t
intptr\u t
等类型的定义:


但是,我找不到类型的定义,比如
char
。因此,我的问题是,在哪里定义了
int
char
呢?

在哪个头文件中定义了
char

无处-
char
是内置类型,而不是用户定义的类型。它是核心语言的一部分。这同样适用于
int

所有这些内置类型都没有定义吗?

有。该标准没有定义这些内置类型


请注意,
char
int
也都是关键字,这意味着您不能将它们用作标识符,因为它们在语言中有保留和已分配的用法

因此,我的问题是,int,char定义在哪里

它们的定义如下:


reader中的第57+页或文档中的第39+页

未在任何头文件中定义
char
int
类型。它们是内置类型,这意味着它们是核心语言的一部分。它们的定义被硬编码到编译器本身中

至于编译器如何定义这些类型,这取决于

int
char
的定义见第6.2.5节(类型)。例如,
char
的定义:

3声明为type
char
的对象足够大,可以存储任何成员 基本执行字符集的。如果基本法委员会的成员 执行字符集存储在
char
对象中,其值为 保证是非负的。如果任何其他字符存储在
char
对象,结果值是实现定义的,但应 在该类型中可以表示的值的范围内

其他类型的定义以及每种类型的最小值范围如下。

请注意,
int8\u t
intptr\u t
等的“定义”只是内置类型的别名

基本数据类型
char
int
long
double
等都是在编译器内部定义的,它们没有在任何头文件中定义。语言标准中规定了其最低范围(可提供非官方的出版前草案)

头文件
将显示特定实现的不同整数类型的范围;下面是我正在使用的实现的摘录:

/* Number of bits in a `char'.  */
#  define CHAR_BIT      8

/* Minimum and maximum values a `signed char' can hold.  */
#  define SCHAR_MIN     (-128)
#  define SCHAR_MAX     127

/* Maximum value an `unsigned char' can hold.  (Minimum is 0.)  */
#  define UCHAR_MAX     255

/* Minimum and maximum values a `char' can hold.  */
#  ifdef __CHAR_UNSIGNED__
#   define CHAR_MIN     0
#   define CHAR_MAX     UCHAR_MAX
#  else
#   define CHAR_MIN     SCHAR_MIN
#   define CHAR_MAX     SCHAR_MAX
#  endif

/* Minimum and maximum values a `signed short int' can hold.  */
#  define SHRT_MIN      (-32768)
#  define SHRT_MAX      32767

/* Maximum value an `unsigned short int' can hold.  (Minimum is 0.)  */
#  define USHRT_MAX     65535

/* Minimum and maximum values a `signed int' can hold.  */
#  define INT_MIN       (-INT_MAX - 1)
#  define INT_MAX       2147483647

/* Maximum value an `unsigned int' can hold.  (Minimum is 0.)  */
#  define UINT_MAX      4294967295U

/* Minimum and maximum values a `signed long int' can hold.  */
#  if __WORDSIZE == 64
#   define LONG_MAX     9223372036854775807L
#  else
#   define LONG_MAX     2147483647L
#  endif
同样,这并没有定义编译器的类型,这只是信息性的;例如,您可以使用这些宏来防止溢出。有一个
头,它对浮点类型执行类似的操作

char
类型必须至少能够表示基本执行字符集中的每个值-大写和小写拉丁字母、所有十进制数字、常用标点符号和控制字符(换行符、换行符、回车符、制表符等)
char
的宽度必须至少为8位,但在某些系统上可能更宽。关于
char
的签名有一些奇怪之处-基本执行字符集的成员保证为非负(
[0…127]
),但其他字符可能有正值或负值,因此“普通”
char
可能与
signed char
unsigned char
具有相同的范围。这取决于实施情况

int
类型必须能够表示至少在
[-32767…32767]
范围内的值。具体范围由实现决定,具体取决于字长和有符号整数表示


C是20世纪70年代早期的产物,当时字节和字的大小多种多样——从历史上看,字节的宽度可以是7到9位,字的宽度可以是16到18位,等等。二的幂是方便的,但不是神奇的。类似地,有符号整数有多种表示形式(2的补码、1的补码、符号大小等)。因此,语言定义指定了最低要求,由实现者将这些要求映射到目标平台

我想知道您希望如何定义它?@Eugene Sh。它们在标准中定义:)如果在某些标题中定义非常基本的数据类型,那么应该使用哪种更基本的数据类型来实现这一点?那么这些数据类型将在哪里定义呢?好奇的是,为什么
typedef\u签名字符int8\t和非
typedef签名字符int8?(
丢弃)夸克是由什么构成的???
无处
。那么编译器设计者如何知道实现什么呢。是否由他们自行决定?(例如,
char
是32位浮点数,
double
是两字节字符?)非常感谢!但是我仍然很好奇成为
内置的
意味着什么?我的意思是它必须被定义在某个地方,对吗?我知道这听起来可能很傻。如果您能给我一些提示,我将不胜感激。它们在标准中有定义。它们不能在其他任何地方定义,因为如果没有任何现有类型或标准中内置的自定义类型声明语句(大小、填充位、符号、对齐…),您如何定义类型?@Christyle:编译器决定
int
的长度。当它看到C代码声明了一个
int
,它就为这个变量分配了那么多内存。@KevinDTimm我知道-很难找到“类型”一章,因为它的标题非常混乱。官方批准的版本可以在ansi和ISO网页上找到(收费)
/* Number of bits in a `char'.  */
#  define CHAR_BIT      8

/* Minimum and maximum values a `signed char' can hold.  */
#  define SCHAR_MIN     (-128)
#  define SCHAR_MAX     127

/* Maximum value an `unsigned char' can hold.  (Minimum is 0.)  */
#  define UCHAR_MAX     255

/* Minimum and maximum values a `char' can hold.  */
#  ifdef __CHAR_UNSIGNED__
#   define CHAR_MIN     0
#   define CHAR_MAX     UCHAR_MAX
#  else
#   define CHAR_MIN     SCHAR_MIN
#   define CHAR_MAX     SCHAR_MAX
#  endif

/* Minimum and maximum values a `signed short int' can hold.  */
#  define SHRT_MIN      (-32768)
#  define SHRT_MAX      32767

/* Maximum value an `unsigned short int' can hold.  (Minimum is 0.)  */
#  define USHRT_MAX     65535

/* Minimum and maximum values a `signed int' can hold.  */
#  define INT_MIN       (-INT_MAX - 1)
#  define INT_MAX       2147483647

/* Maximum value an `unsigned int' can hold.  (Minimum is 0.)  */
#  define UINT_MAX      4294967295U

/* Minimum and maximum values a `signed long int' can hold.  */
#  if __WORDSIZE == 64
#   define LONG_MAX     9223372036854775807L
#  else
#   define LONG_MAX     2147483647L
#  endif