C语言基本数据类型 #
一、数据类型概述 #
1.1 数据类型分类 #
text
C语言数据类型
├── 基本类型
│ ├── 整型
│ │ ├── int
│ │ ├── short
│ │ ├── long
│ │ └── long long
│ ├── 浮点型
│ │ ├── float
│ │ └── double
│ └── 字符型
│ └── char
├── 构造类型
│ ├── 数组
│ ├── 结构体
│ ├── 联合
│ └── 枚举
├── 指针类型
│ └── type*
└── 空类型
└── void
1.2 类型大小 #
使用 sizeof 获取类型大小:
c
#include <stdio.h>
int main() {
printf("char: %zu字节\n", sizeof(char));
printf("short: %zu字节\n", sizeof(short));
printf("int: %zu字节\n", sizeof(int));
printf("long: %zu字节\n", sizeof(long));
printf("long long: %zu字节\n", sizeof(long long));
printf("float: %zu字节\n", sizeof(float));
printf("double: %zu字节\n", sizeof(double));
return 0;
}
典型输出(64位系统):
text
char: 1字节
short: 2字节
int: 4字节
long: 8字节
long long: 8字节
float: 4字节
double: 8字节
二、整型 #
2.1 整型类型 #
| 类型 | 字节 | 取值范围 |
|---|---|---|
| char | 1 | -128 ~ 127 |
| unsigned char | 1 | 0 ~ 255 |
| short | 2 | -32768 ~ 32767 |
| unsigned short | 2 | 0 ~ 65535 |
| int | 4 | -2147483648 ~ 2147483647 |
| unsigned int | 4 | 0 ~ 4294967295 |
| long | 4/8 | 系统相关 |
| unsigned long | 4/8 | 系统相关 |
| long long | 8 | -2^63 ~ 2^63-1 |
| unsigned long long | 8 | 0 ~ 2^64-1 |
2.2 int类型 #
c
int a = 10;
int b = -20;
int c = 0;
不同进制:
c
int decimal = 100;
int octal = 0144;
int hex = 0x64;
int binary = 0b1100100;
输出格式:
c
#include <stdio.h>
int main() {
int num = 100;
printf("十进制: %d\n", num);
printf("八进制: %o\n", num);
printf("十六进制: %x\n", num);
printf("十六进制: %X\n", num);
return 0;
}
2.3 short类型 #
c
short a = 100;
short b = -200;
节省内存,但范围较小。
2.4 long类型 #
c
long a = 1000000L;
long b = -2000000L;
注意:使用 L 或 l 后缀。
2.5 long long类型 #
c
long long a = 9223372036854775807LL;
long long b = -9223372036854775808LL;
注意:使用 LL 或 ll 后缀。
2.6 无符号整型 #
c
unsigned int a = 4000000000U;
unsigned long b = 18446744073709551615UL;
注意:使用 U 或 u 后缀。
2.7 整型溢出 #
c
#include <stdio.h>
#include <limits.h>
int main() {
int a = INT_MAX;
printf("最大值: %d\n", a);
a = a + 1;
printf("溢出后: %d\n", a);
return 0;
}
输出:
text
最大值: 2147483647
溢出后: -2147483648
2.8 limits.h #
c
#include <limits.h>
printf("INT_MIN: %d\n", INT_MIN);
printf("INT_MAX: %d\n", INT_MAX);
printf("LONG_MIN: %ld\n", LONG_MIN);
printf("LONG_MAX: %ld\n", LONG_MAX);
printf("LLONG_MIN: %lld\n", LLONG_MIN);
printf("LLONG_MAX: %lld\n", LLONG_MAX);
三、浮点型 #
3.1 浮点类型 #
| 类型 | 字节 | 有效数字 | 取值范围 |
|---|---|---|---|
| float | 4 | 6-7位 | ±3.4E38 |
| double | 8 | 15-16位 | ±1.7E308 |
| long double | 10-16 | 18-19位 | 系统相关 |
3.2 float类型 #
c
float a = 3.14f;
float b = -2.5f;
float c = 1.0e10f;
注意:使用 f 或 F 后缀。
c
#include <stdio.h>
int main() {
float f = 3.14159265358979f;
printf("float: %.15f\n", f);
return 0;
}
输出:
text
float: 3.141592741012573
3.3 double类型 #
c
double a = 3.14159265358979;
double b = -2.5;
double c = 1.0e100;
c
#include <stdio.h>
int main() {
double d = 3.14159265358979;
printf("double: %.15f\n", d);
return 0;
}
输出:
text
double: 3.141592653589790
3.4 long double类型 #
c
long double a = 3.14159265358979L;
注意:使用 L 或 l 后缀。
3.5 浮点数精度问题 #
c
#include <stdio.h>
int main() {
float a = 0.1f;
float b = 0.2f;
float c = a + b;
printf("0.1 + 0.2 = %.20f\n", c);
printf("是否等于0.3: %s\n", c == 0.3f ? "是" : "否");
return 0;
}
输出:
text
0.1 + 0.2 = 0.30000001192092895508
是否等于0.3: 否
3.6 float.h #
c
#include <float.h>
printf("FLT_MIN: %e\n", FLT_MIN);
printf("FLT_MAX: %e\n", FLT_MAX);
printf("FLT_DIG: %d\n", FLT_DIG);
printf("DBL_MIN: %e\n", DBL_MIN);
printf("DBL_MAX: %e\n", DBL_MAX);
printf("DBL_DIG: %d\n", DBL_DIG);
3.7 特殊浮点值 #
c
#include <math.h>
#include <stdio.h>
int main() {
double inf = INFINITY;
double nan_val = NAN;
printf("无穷大: %f\n", inf);
printf("非数: %f\n", nan_val);
printf("是否无穷: %d\n", isinf(inf));
printf("是否NaN: %d\n", isnan(nan_val));
return 0;
}
四、字符型 #
4.1 char类型 #
c
char c1 = 'A';
char c2 = 65;
char c3 = '\x41';
以上三种方式等价。
4.2 字符与整数 #
c
#include <stdio.h>
int main() {
char c = 'A';
printf("字符: %c\n", c);
printf("ASCII: %d\n", c);
return 0;
}
输出:
text
字符: A
ASCII: 65
4.3 ASCII码表 #
| 字符 | ASCII | 字符 | ASCII |
|---|---|---|---|
| ‘0’-‘9’ | 48-57 | ‘A’-‘Z’ | 65-90 |
| ‘a’-‘z’ | 97-122 | ‘\n’ | 10 |
| ‘\t’ | 9 | ‘\0’ | 0 |
| ’ ’ | 32 | ‘\r’ | 13 |
4.4 转义字符 #
| 转义字符 | 说明 | ASCII |
|---|---|---|
| \n | 换行 | 10 |
| \t | 制表符 | 9 |
| \r | 回车 | 13 |
| \b | 退格 | 8 |
| \f | 换页 | 12 |
| \a | 响铃 | 7 |
| \ | 反斜杠 | 92 |
| ' | 单引号 | 39 |
| " | 双引号 | 34 |
| \0 | 空字符 | 0 |
| \xhh | 十六进制 | - |
| \ooo | 八进制 | - |
4.5 signed vs unsigned char #
c
char c1 = 127;
c1 = c1 + 1;
printf("%d\n", c1);
unsigned char c2 = 255;
c2 = c2 + 1;
printf("%u\n", c2);
五、void类型 #
5.1 void用途 #
函数无返回值:
c
void print_hello(void) {
printf("Hello, World!\n");
}
函数无参数:
c
int get_value(void) {
return 10;
}
通用指针:
c
void* ptr;
int a = 10;
ptr = &a;
int* p = (int*)ptr;
六、类型限定符 #
6.1 const #
只读限定:
c
const int a = 10;
const char* str = "Hello";
6.2 volatile #
防止优化:
c
volatile int flag = 0;
while (flag == 0) {
}
6.3 restrict #
指针独占访问(C99):
c
void func(int* restrict a, int* restrict b) {
*a = 10;
*b = 20;
}
七、类型别名 #
7.1 typedef #
c
typedef unsigned char byte;
typedef unsigned int uint;
typedef long long int64;
byte b = 255;
uint n = 100;
int64 big = 9223372036854775807LL;
7.2 标准类型别名 #
c
#include <stdint.h>
int8_t i8 = 127;
int16_t i16 = 32767;
int32_t i32 = 2147483647;
int64_t i64 = 9223372036854775807LL;
uint8_t u8 = 255;
uint16_t u16 = 65535;
uint32_t u32 = 4294967295U;
uint64_t u64 = 18446744073709551615ULL;
size_t size = sizeof(int);
ptrdiff_t diff = ptr2 - ptr1;
八、类型选择建议 #
8.1 整数类型选择 #
| 场景 | 推荐类型 |
|---|---|
| 一般整数 | int |
| 大整数 | long long |
| 字节 | unsigned char |
| 大小/索引 | size_t |
| 固定宽度 | int32_t, int64_t |
8.2 浮点类型选择 #
| 场景 | 推荐类型 |
|---|---|
| 一般浮点 | double |
| 节省内存 | float |
| 高精度 | long double |
8.3 字符类型选择 #
| 场景 | 推荐类型 |
|---|---|
| 字符 | char |
| 字节 | unsigned char |
| 小整数 | int8_t |
九、类型转换 #
9.1 隐式转换 #
c
int a = 10;
float b = a;
double c = b;
9.2 显式转换 #
c
float f = 3.14;
int a = (int)f;
9.3 整型提升 #
c
char a = 10;
char b = 20;
int c = a + b;
9.4 算术转换 #
c
int a = 10;
float b = 3.14;
float c = a + b;
十、总结 #
基本类型 #
| 类型 | 大小 | 用途 |
|---|---|---|
| char | 1字节 | 字符、小整数 |
| short | 2字节 | 小整数 |
| int | 4字节 | 一般整数 |
| long | 4/8字节 | 大整数 |
| long long | 8字节 | 很大整数 |
| float | 4字节 | 单精度浮点 |
| double | 8字节 | 双精度浮点 |
类型选择 #
- 优先使用 int 处理整数
- 优先使用 double 处理浮点
- 使用 size_t 处理大小和索引
- 使用固定宽度类型保证可移植性
注意事项 #
- 注意整型溢出
- 注意浮点精度
- 注意有符号/无符号混用
- 使用 sizeof 获取类型大小
下一步,让我们学习类型转换!
最后更新:2026-03-26