
c语言作为一门面向过程的系统编程语言,并不区分“原始类型”与“对象类型”,因此没有java等面向对象语言中定义的primitive types概念;其所有数据类型均为基本内置类型,设计目标是跨平台效率而非统一尺寸。
在Java等面向对象语言中,“primitive types”(如 int、boolean、char)是为区别于引用类型(如 Integer、String)而提出的语义分类——它们不继承自任何类、不具有方法、直接存储值且由JVM严格规定大小(例如 int 恒为32位)。但C语言根本不存在这种二元划分的基础:它没有类、没有对象、没有自动装箱/拆箱机制,也没有运行时类型系统。 因此,谈论C中的“primitive types”属于概念误植。
C标准(ISO/IEC 9899)仅定义了 “basic types”(基本类型) 和派生类型(如数组、结构体、指针、联合体、函数类型等)。其中基本类型包括:
-
整数类型(integer types):
- 有符号:signed char、short int、int、long int、long long int
- 无符号:unsigned char、unsigned short int、unsigned int、unsigned long int、unsigned long long int
- 注意:char 单独存在,其符号性由实现定义(可等价于 signed char 或 unsigned char);bool 并非原生类型,而是
中通过宏 #define bool _Bool 引入的别名,_Bool 才是C99引入的标准基本类型。
-
实浮点类型(real floating types):
float、double、long double立即学习“C语言免费学习笔记(深入)”;
空类型(void type):
void —— 表示“无类型”,用于函数返回值、指针泛型等场景,不可用于变量声明(除非作为指针基类型,如 void*)。
此外,C还支持带限定符的类型(如 const int、volatile char),但限定符不改变类型本质,仅修饰访问语义。
值得注意的是,C对类型的尺寸不做绝对保证,仅规定最小范围和相对关系(见C17标准 §5.2.4.2.1):
#include#include #include int main() { printf("sizeof(int) >= %d bytes\n", sizeof(short)); // guaranteed: sizeof(short) <= sizeof(int) <= sizeof(long) printf("INT_MIN: %d, INT_MAX: %d\n", INT_MIN, INT_MAX); // at least -32767 ~ +32767 (16-bit min) printf("FLT_DIG: %d decimal digits (float)\n", FLT_DIG); // at least 6 return 0; }
这与Java形成鲜明对比:Java中 int 永远是32位、long 永远是64位,而C中 int 在16位MCU上可能仅16位,在x86-64 Linux上常为32位,在某些嵌入式平台甚至可能是24位——这是C“贴近硬件、效率优先”哲学的直接体现。
✅ 总结与建议:
- 不要将Java/C#等语言的“primitive vs reference”范式套用于C;
- 在C中应使用标准术语:“basic types”(基本类型)、“derived types”(派生类型);
- 需要可移植尺寸时,务必使用
中的定宽类型(如 int32_t、uint8_t),而非依赖 int 或 long 的隐含大小; - 理解 char 的特殊地位(字节单位、字符/小整数通用)、_Bool 的标准化引入(C99)及 void 的独特语义,是掌握C类型系统的基石。










