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;

注意:使用 Ll 后缀。

2.5 long long类型 #

c
long long a = 9223372036854775807LL;
long long b = -9223372036854775808LL;

注意:使用 LLll 后缀。

2.6 无符号整型 #

c
unsigned int a = 4000000000U;
unsigned long b = 18446744073709551615UL;

注意:使用 Uu 后缀。

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;

注意:使用 fF 后缀。

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;

注意:使用 Ll 后缀。

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