03 · 数据类型与变量
还
基本类型与常见字节数(和平台有关,用 sizeof 实测)
| 类型 | 典型大小 | 说明 |
|---|---|---|
char |
1 | 字符 / 小整数 |
short |
2 | 短整型 |
int |
4 | 最常用整型 |
long |
4 或 8 | 平台相关 |
long long |
8 | 长整型 |
float |
4 | 单精度(注意 ~6-7 位有效数字) |
double |
8 | 双精度,默认浮点类型 |
void |
— | 无类型 |
printf("%zu\n", sizeof(int)); // 查看占用字节数
声明与初始化(和 Java 最大的差异点)
int count = 0; // 局部变量
float price = 9.99;
char grade = 'A';
int x; // ❌ 未初始化的局部变量 = 垃圾值(不确定值)
- 局部变量不初始化就是垃圾值(Java 会默认给 0,C 不会!)
- 全局变量和
static变量会被自动初始化为 0。 - C89 要求变量声明必须在代码块最开头(C99 起允许随用随声明)。
类型转换(隐式 vs 显式)
int a = 5, b = 2;
double r = a / b; // ❌ = 2.0,整数除法先算完再转换
double ok = (double)a / b; // ✅ = 2.5
详见 17-类型转换与错误处理。
有符号 / 无符号
unsigned int u = 10; // 只能表示非负,范围更大
signed int s = -10; // 默认就是 signed
⚠️ 有符号与无符号混用比较是经典坑,unsigned 会「吃掉」负数。
⚡ Java 对比
- Java 的
int永远 32 位;C 的int大小由平台决定(用<stdint.h>的int32_t才保险)。 - Java 有自动装箱、
Integer对象;C 只有原始类型,没有包装类。 - Java 的
String是对象;C 只有char数组(见 11-字符串)。