数据类型

翻译整理自 cppreference - 类型。

1. 基本类型

类型 典型大小 范围
char 1 byte -128127 或 0255
signed char 1 byte -128~127
unsigned char 1 byte 0~255
short ≥ 2 byte -32768~32767
unsigned short ≥ 2 byte 0~65535
int ≥ 2 byte(通常 4) -2³¹~2³¹-1
unsigned int 同上 0~2³²-1
long ≥ 4 byte -2³¹~2³¹-1
long long (C99) ≥ 8 byte -2⁶³~2⁶³-1
float 4 byte ±3.4×10³⁸
double 8 byte ±1.7×10³⁰⁸
long double 8~16 byte 更高精度
_Bool (C99) 1 byte 0 或 1

可用 sizeof 查看大小:

printf("int=%zu\n", sizeof(int));

可用 <stdint.h> 获得定长类型:

#include <stdint.h>
int32_t  a;
uint64_t b;

2. 字符类型

char c = 'A';
printf("%c %d\n", c, c);     // A 65

C 中 char 既是字符也是小整数。

3. 浮点

float  f = 3.14f;
double d = 3.14;            // 默认 double
1.0 / 3.0                   // 0.333333

科学计数:

double x = 1.5e3;           // 1500.0
double y = 1.5e-3;          // 0.0015

4. void

void 表示"无类型":

  • 函数无返回值:void f(void);
  • 通用指针:void *p;

5. 枚举 enum

enum Color { RED, GREEN, BLUE };
enum Color c = GREEN;
printf("%d\n", c);          // 1

可指定值:

enum Status {
    OK = 200,
    NotFound = 404,
    ServerError = 500
};

6. 类型限定符

限定符 含义
const 只读
volatile 阻止编译器优化(用于硬件寄存器、信号)
restrict (C99) 指针不重叠,可优化
_Atomic (C11) 原子类型
const int MAX = 100;
volatile int *hw_reg = (int *)0x40021000;

7. 类型转换

隐式转换

int i = 3;
double d = i;             // int → double,安全
int j = 3.7;              // double → int,截断为 3

显式转换(cast)

double pi = 3.14;
int truncated = (int)pi;  // 3

8. typedef 别名

typedef unsigned long size_t;
typedef int (*cmp_t)(const void *, const void *);

size_t n = 100;

9. sizeof

sizeof 返回类型大小(编译期常量):

printf("%zu\n", sizeof(int[10]));   // 40

注意:对数组名取 sizeof 得到整个数组大小,对指针取 sizeof 只得到指针大小。

小结

掌握类型与限定符后,你可以写出更安全的 C 代码。下一章学习运算符。