C语言基本数据类型
在编程中,数据类型决定了变量可以存储什么样的数据以及占用多少内存空间。
C语言提供了丰富的基本数据类型,包括整型、浮点型和字符型等。理解这些数据类型是编写高效、正确程序的基础。
本节将详细介绍C语言的基本数据类型及其特性。
📊 数据类型概述
C语言中的数据类型分为四大类:基本数据类型、构造数据类型(如数组、结构体、共用体)、
指针类型和空类型(void)。本章重点讲解基本数据类型,它们是构成更复杂数据的基础。
注意: C语言没有内置的字符串类型,字符串通常用字符数组表示,我们将在后续章节学习。
🔢 整型(Integer)
整型用于存储整数(不包含小数部分)。C语言提供多种整型,以适应不同范围的数值需求。
主要整型包括:
int —— 基本整型,通常占4个字节(32位),范围约 -2.1e9 ~ 2.1e9。
short 或 short int —— 短整型,通常占2个字节,范围 -32768 ~ 32767。
long 或 long int —— 长整型,在32位系统通常占4字节,64位系统占8字节。
long long —— 长长整型,至少占8字节(C99标准引入)。
整型还可以配合 signed(有符号)和 unsigned(无符号)修饰符使用:
有符号(默认):可存储正数、负数和0。
无符号:只存储非负数,能表示的正数范围大约是同样大小有符号类型的两倍。
📏 整型大小与范围(常见平台)
类型
大小(字节)
有符号范围
无符号范围
格式说明符
short2-32,768 ~ 32,7670 ~ 65,535%hd / %hu
int4-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295%d / %u
long4 或 8*至少 -2,147,483,648 ~ 2,147,483,647至少 0 ~ 4,294,967,295%ld / %lu
long long8-9.2e18 ~ 9.2e180 ~ 1.8e19%lld / %llu
* 取决于系统和编译器,在64位Linux/macOS上 long 通常为8字节,Windows上为4字节。
💻 整型示例代码
#include
int main() {
int a = 100;
short b = 2000;
long c = 123456789L; // L后缀表示long类型
unsigned int d = 40000; // 无符号整型
printf("int: %d\n", a);
printf("short: %hd\n", b);
printf("long: %ld\n", c);
printf("unsigned int: %u\n", d);
// 使用sizeof查看类型占用的字节数
printf("Size of int: %zu bytes\n", sizeof(int));
printf("Size of short: %zu bytes\n", sizeof(short));
printf("Size of long: %zu bytes\n", sizeof(long));
printf("Size of long long: %zu bytes\n", sizeof(long long));
return 0;
}
小提示: sizeof 是C语言运算符,用于计算数据类型或变量所占内存大小,返回 size_t 类型,通常用 %zu 格式输出。
🔤 字符型(char)
char 类型用于存储单个字符,如字母、数字、标点符号等。
实际上,字符在内存中是以其ASCII码(整数)存储的,因此 char 本质上也是一种整型。
它通常占1个字节(8位),可以存储 -128 到 127(有符号)或 0 到 255(无符号)的整数。
字符型示例代码
#include
int main() {
char ch = 'A'; // 字符常量用单引号
char grade = 65; // 65对应ASCII码 'A'
unsigned char num = 200; // 无符号字符
printf("ch = %c, ASCII = %d\n", ch, ch);
printf("grade = %c, ASCII = %d\n", grade, grade);
printf("num = %d\n", num);
return 0;
}
格式化输出: 使用 %c 输出字符,%d 输出其ASCII码值。
🌊 浮点型(Floating-point)
浮点型用于存储实数(带小数点的数)。C语言提供两种主要的浮点类型:
float —— 单精度浮点型,通常占4字节,精度约6-7位有效数字。
double —— 双精度浮点型,通常占8字节,精度约15-16位有效数字,是默认的浮点类型。
long double —— 扩展精度浮点型,大小和精度依赖平台(通常10或16字节)。
浮点型示例代码
#include
int main() {
float pi = 3.14159f; // f后缀表示float常量
double e = 2.718281828459045;
long double lg = 1.234567890123456789L;
printf("float: %f\n", pi);
printf("double: %.15f\n", e); // 控制输出精度
printf("long double: %Lf\n", lg);
printf("Size of float: %zu bytes\n", sizeof(float));
printf("Size of double: %zu bytes\n", sizeof(double));
printf("Size of long double: %zu bytes\n", sizeof(long double));
return 0;
}
注意: 浮点数在计算机中采用近似表示,比较两个浮点数是否相等时应使用差值小于某个精度,而不是直接使用 ==。
🧩 void类型
void 表示“无类型”,主要用于以下场景:
函数无返回值:void func(void);
函数无参数:int func(void); (虽然可以省略,但建议显式写明)
通用指针:void * 可以指向任何类型的数据,用于实现泛型编程。
说明: void 不能直接定义变量(如 void a; 是错误的),因为它代表未知类型,编译器无法分配内存。
🔄 类型转换
在C语言中,不同类型的数据可以进行混合运算,此时会发生类型转换。
转换分为隐式转换(自动)和显式转换(强制)。
隐式转换规则(部分)
在算术运算中,较低精度类型会自动提升为较高精度类型(如 int 和 float 运算,int 转为 float)。
赋值时,右边表达式的类型会转换为左边变量的类型,可能发生截断或精度损失。
整型提升:char 和 short 在表达式中通常会被提升为 int。
强制类型转换示例
#include
int main() {
int a = 10;
int b = 3;
float result = (float)a / b; // 将a强制转换为float,避免整数除法
printf("10 / 3 = %f\n", result);
char ch = 'A';
int ascii = (int)ch; // 将字符转为ASCII码
printf("ASCII of %c = %d\n", ch, ascii);
return 0;
}
💡 数据类型选择建议
如果数值范围在 int 范围内,优先使用 int,它通常是最快的类型。
需要节省内存时(如大数组),使用 short 或 char。
需要存储大整数(超过21亿)时,使用 long long 或 unsigned long long。
浮点数优先使用 double,除非内存非常紧张且精度要求不高。
字符用 char,注意是否需要无符号(例如存储二进制数据)。
现在你已经掌握了C语言的基本数据类型。下一章我们将学习如何声明变量和常量,以及变量的作用域和生命周期。
请动手运行本节中的示例代码,观察不同数据类型的大小和输出结果。
上一章: Hello World 程序解析
下一章: 变量与常量