C语言数据类型与变量 系统总结笔记

一、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 变量三要素

  1. 类型:决定存储空间和操作方式
  2. 名称:标识符规则
  3. :存储在内存中的数据

2.2 变量定义语法

c 复制代码
// 标准格式:[存储类别] 数据类型 变量名 [= 初始值];
int count;              // 声明未初始化(值不确定)
double price = 99.95;   // 声明并初始化
char grade = 'A';       // 字符初始化

2.3 变量命名规范

  • 组成:字母、数字、下划线
  • 开头:字母或下划线(不能数字)
  • 区分大小写:countCount
  • 避开关键字: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 类型选择原则

  1. 整型优先考虑int,满足范围再用long
  2. 浮点默认用double,节省内存用float
  3. 明确正负性:非负数据用unsigned
  4. 精确计算避免浮点误差(如货币用整数分存储)

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

八、核心概念总结

  1. 数据类型是编译器的内存分配蓝图

    • 决定变量占多少字节
    • 决定如何解释存储的二进制
    • 决定能进行的运算操作
  2. 变量是命名的内存空间

    • 必须先定义后使用
    • 生命周期由作用域决定
    • 值可改变(除非const限定)
  3. 类型安全是C程序员的责任

    • C语言类型检查较宽松
    • 需自行确保类型兼容性
    • 避免隐式类型转换的陷阱
  4. 选择类型的三要素

    • 需要的数值范围
    • 需要的精度
    • 内存和性能考量

相关推荐
@淡 定2 小时前
JVM调优参数配置详解
java·jvm·算法
CoovallyAIHub2 小时前
从电影特效到体育科学,运动追踪只能靠“人眼”吗?
深度学习·算法·计算机视觉
风筝在晴天搁浅2 小时前
hot100 48.旋转图像
算法
小智RE0-走在路上2 小时前
Python学习笔记(10) -- 异常,模块,包
笔记·python·学习
TechNomad2 小时前
排序算法:希尔排序算法
数据结构·算法·排序算法
热爱生活的猴子2 小时前
算法中DFS & BFS 核心学习笔记
算法·深度优先·宽度优先
im_AMBER2 小时前
Leetcode 83 使数组平衡的最少移除数目中等相关标签 | 尽可能使字符串相等
数据结构·c++·笔记·学习·算法·leetcode
XFF不秃头3 小时前
力扣刷题笔记-组合总和
c++·笔记·leetcode
TechNomad3 小时前
排序算法:快速排序算法
算法·排序算法