C编程语言中的“int”和“char”类型定义在哪里?

4

我正在学习C语言的工作原理。我可以在<stdlib.h>中找到像int8_tintptr_t等类型的定义:

// Represents true-or-false values
typedef _Bool bool;
enum { false, true };

// Explicitly-sized versions of integer types
typedef __signed char int8_t;
typedef unsigned char uint8_t;
typedef short int16_t;
typedef unsigned short uint16_t;
typedef int int32_t;
typedef unsigned int uint32_t;
typedef long long int64_t;
typedef unsigned long long uint64_t;

// Pointers and addresses are 32 bits long.
// We use pointer types to represent virtual addresses,
// uintptr_t to represent the numerical values of virtual addresses,
// and physaddr_t to represent physical addresses.
typedef int32_t intptr_t;
typedef uint32_t uintptr_t;
typedef uint32_t physaddr_t;

然而,我找不到像char这样的类型的定义。因此我的问题是,intchar是在哪里定义的?


2
我想知道你希望它如何定义? - Eugene Sh.
@Eugene Sh. 它们在标准中已经定义了 :) - 0___________
2
如果一些基本的数据类型将在某个头文件中定义,那么应该使用哪些更基本的数据类型来完成这个任务?这些数据类型应该在哪里定义? - Gerhardh
1
有点好奇 - 为什么要写成 typedef __signed char int8_t; 而不是 typedef signed char int8_t;?(去掉了 __ - chux - Reinstate Monica
什么是夸克由什么组成的? - yano
4个回答

8
“char”在哪个头文件中定义?

没有 - “char”是内置类型,而不是用户自定义类型。它是核心语言的一部分。同样适用于“int”。

这些内置类型没有任何定义吗?

有的。标准确实定义了这些内置类型。


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


1
“Nowhere”. 那么编译器设计者如何知道要实现什么呢?这是由他们自行决定的吗?(例如将 char 实现为 32 位浮点数,将 double 实现为两个字节的字符?) - 0___________
非常感谢!但我仍然好奇built-in是什么意思?我的意思是它一定在某个地方被定义了,对吧?不一定是在C语言中。我知道这可能听起来很傻。如果您能给我一些提示,我会非常感激的。 - Christy Lee
它们在标准中被定义。它们不能在其他任何地方被定义,因为如果没有任何现有类型或内置于标准中的自定义类型声明语句(大小、填充位、符号性、对齐等),你如何定义一个类型呢? - phuclv
@ChristyLee:编译器决定了int变量占用多少字节。当它看到C代码声明一个int变量时,就会为该变量分配相应的内存空间。 - luther

5
charint等类型并未在任何头文件中定义。它们是内置类型,意味着它们是核心语言的一部分。它们的定义已经硬编码到编译器本身中。
至于编译器如何定义这些类型,这是由C标准规定的。 intchar的定义可以在第6.2.5节(类型)中找到。例如,char的定义如下:
3. 声明为类型char的对象足够大,可以存储基本执行字符集中的任何成员。如果将基本执行字符集的成员存储在char对象中,则其值保证为非负数。如果将任何其他字符存储在char对象中,则得到的值是实现定义的,但必须在该类型可以表示的值范围内。
其他类型的定义以及每种类型的最小值范围如下。

1
C标准规定了基本类型的最低要求。它并不规定所有要求,编译器可以超过最低要求。例如,一个int必须能够表示值范围为-3276732767,但很多编译器提供了能够表示更大范围(如32位类型)的int - Peter

1

正式批准的版本可在ansi和ISO网页上获取(需付费),而非open-std.org(或isocpp.org)。open-std.org上的版本未经官方批准(例如,是先于正式发布标准的草案,即使晚期草案与正式标准的差异相当小)。 - Peter
@Peter 你会成为赞助商吗? - 0___________
@Peter 如果你建议人们购买200美元以上的文档,也许你应该为学生开设基金并赞助这份文档。 - 0___________
阅读SO的建议/改述/包含信息而不仅仅是链接,因为链接会消失。 - KevinDTimm
@PeterJ - 我并不建议人们购买文档。我只是指出了正式的来源以及非正式的替代品。你的措辞把你的链接描述成一个明确的来源,但实际上它并不是 - 因此在问题所涉及的语境中具有误导性。人们可以自行决定哪个版本更符合他们的需求。 - Peter
显示剩余5条评论

1
请注意,int8_tintptr_t等的“定义”只是内置类型的别名。
基本数据类型charintlongdouble等都是在编译器内部定义的,它们不在任何头文件中定义。它们的最小范围在语言标准中指定(非官方版本的预发布草案可在此处找到)。
头文件<limits.h>将显示特定实现的不同整数类型的范围;以下是我正在使用的实现的摘录:
/* 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

再次说明,这并不是为编译器定义类型,而仅仅是提供信息;例如,您可以使用这些宏来防止溢出。与此类似的有一个名为 <float.h> 的头文件,用于浮点数类型。

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

“int”类型必须能够表示至少范围在“[-32767...32767]”之间的值。确切的范围取决于实现,取决于字长和有符号整数表示方式。
C是20世纪70年代早期的产物,在那个时候字节和字长有很多变化 - 历史上,字节可以从7位到9位宽,字可以是16到18位宽等。2的幂对我们来说很方便,但并非神奇。同样,有多种有符号整数的表示方法(二进制补码、反码、原码等)。因此,语言定义规定了最低要求,而实现者则需要将其映射到目标平台上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接