一、C语言数据类型体系
1.1 基本数据类型(按存储大小排序)
整型家族
c
// 有符号整型(默认)
char // 1字节,范围:-128 ~ 127
short // 2字节,范围:-32768 ~ 32767
int // 通常4字节,范围:-2^31 ~ 2^31-1
long // 4或8字节,依赖平台
long long // 8字节,C99引入
// 无符号整型(加unsigned前缀)
unsigned char // 0 ~ 255
unsigned short // 0 ~ 65535
unsigned int // 0 ~ 2^32-1
实型(浮点型)
c
float // 4字节,单精度,约6-7位有效数字
double // 8字节,双精度,约15-16位有效数字
long double // 通常10或16字节,扩展精度
字符型
c
char // 实际存储ASCII码值(整型)
// 特殊字符:'\n'(换行)、'\t'(制表)、'\\'(反斜杠)
空类型
c
void // 表示"无类型",用于函数返回值/参数、通用指针
1.2 派生/构造数据类型
- 数组类型:
int arr[10]; - 指针类型:
int *ptr; - 结构体类型:
struct Student {...}; - 共用体类型:
union Data {...}; - 枚举类型:
enum Color {...}; - 函数类型:
int func(int a, int b);
二、变量详解
2.1 变量三要素
- 类型:决定存储空间和操作方式
- 名称:标识符规则
- 值:存储在内存中的数据
2.2 变量定义语法
c
// 标准格式:[存储类别] 数据类型 变量名 [= 初始值];
int count; // 声明未初始化(值不确定)
double price = 99.95; // 声明并初始化
char grade = 'A'; // 字符初始化
2.3 变量命名规范
- 组成:字母、数字、下划线
- 开头:字母或下划线(不能数字)
- 区分大小写:
count≠Count - 避开关键字:
int, return, if等32个关键字 - 建议:见名知意,小写+下划线风格
2.4 变量初始化要点
c
int a = 10; // 直接初始化
int b = 3 * 5; // 表达式初始化
int c = a + b; // 变量表达式初始化
// 数组初始化
int arr1[3] = {1, 2, 3};
int arr2[] = {1, 2, 3}; // 自动推断长度
// 结构体初始化
struct Point {
int x;
int y;
};
struct Point p1 = {10, 20};
2.5 常量的定义
c
#define PI 3.1415926 // 宏常量(预处理阶段替换)
const int MAX_SIZE = 100; // const常量(编译期检查)
const float TAX_RATE = 0.08;
三、类型修饰符与限定符
3.1 符号修饰符
c
signed int a; // 有符号(默认可省略)
unsigned int b; // 无符号(仅非负)
3.2 大小修饰符
c
short int s; // 短整型
long int l; // 长整型
long double ld; // 长双精度
3.3 类型限定符(C99)
c
const int days = 365; // 值不可修改
volatile int sensor; // 防止编译器优化(硬件相关)
restrict int *ptr; // 指针独占访问提示(性能优化)
四、数据类型关键特性
4.1 类型大小与范围
c
#include <limits.h>
#include <float.h>
printf("int范围: %d ~ %d\n", INT_MIN, INT_MAX);
printf("float精度: %d位\n", FLT_DIG);
4.2 类型转换
隐式(自动)转换
- 规则:小类型→大类型(避免数据丢失)
- 方向:char → short → int → long → float → double
c
int i = 10;
float f = 3.14;
double d = i + f; // i自动转float,再转double
显式(强制)转换
c
double pi = 3.14159;
int intPi = (int)pi; // 截断小数,intPi = 3
float f = (float)10 / 3; // 10.0 / 3.0
五、内存视角理解
5.1 变量内存布局
int num = 42; 在内存中(假设32位系统):
地址: 0x1000 0x1001 0x1002 0x1003
数据: 00 00 00 2A (十六进制,小端序)
5.2 数据存储原理
- 整型:补码表示(正数原码,负数补码)
- 浮点型:IEEE 754标准(符号位+指数位+尾数位)
- 字符型:ASCII码值存储
六、编程实践要点
6.1 类型选择原则
- 整型优先考虑
int,满足范围再用long - 浮点默认用
double,节省内存用float - 明确正负性:非负数据用
unsigned - 精确计算避免浮点误差(如货币用整数分存储)
6.2 常见问题与解决
c
// 1. 整数溢出
unsigned int max = UINT_MAX;
max = max + 1; // 回绕到0(定义行为)
// 2. 浮点比较误差
float a = 0.1 + 0.2;
float b = 0.3;
if (fabs(a - b) < 1e-6) // 不用 == 直接比较
// 3. 符号扩展问题
char c = -1;
int i = c; // i = -1(符号扩展)
unsigned int u = c; // u = 4294967295(问题!)
6.3 好的实践
c
// 明确初始化
int count = 0;
float total = 0.0f;
// 使用类型定义增强可读性
typedef unsigned int uint32_t;
typedef unsigned char byte;
// 合理使用const保护数据
const int MAX_RETRY = 3;
const float PI = 3.1415926f;
// 注意混合运算类型
double result = 10.0 / 3; // 10.0 / 3.0,而非整数除法
七、快速参考表
| 类型 | 典型大小 | 格式符 | 范围示例 |
|---|---|---|---|
| char | 1字节 | %c | -128~127 |
| unsigned char | 1字节 | %c | 0~255 |
| short | 2字节 | %hd | -32768~32767 |
| unsigned short | 2字节 | %hu | 0~65535 |
| int | 4字节 | %d | -2.1e9~2.1e9 |
| unsigned int | 4字节 | %u | 0~4.3e9 |
| long | 4/8字节 | %ld | -9.2e18~9.2e18(64位) |
| float | 4字节 | %f | 约±3.4e±38 |
| double | 8字节 | %lf | 约±1.7e±308 |
八、核心概念总结
-
数据类型是编译器的内存分配蓝图
- 决定变量占多少字节
- 决定如何解释存储的二进制
- 决定能进行的运算操作
-
变量是命名的内存空间
- 必须先定义后使用
- 生命周期由作用域决定
- 值可改变(除非const限定)
-
类型安全是C程序员的责任
- C语言类型检查较宽松
- 需自行确保类型兼容性
- 避免隐式类型转换的陷阱
-
选择类型的三要素
- 需要的数值范围
- 需要的精度
- 内存和性能考量