【程序设计基础】存储单位、传输单位、数据类型

1. 引言

这些基础知识我时常忘记或混淆,因此整理成这篇文章,既作系统梳理,也便于日后查阅。

2. 存储单位

计算机数据存储单位最基础的两个是最小单位“位”和基本单位“字节”,再向上按数量级扩展。

单位 英文/符号 换算关系 说明 进制
位 bit (b) 最小存储单位,取值 0 或 1 最小单位 1 位二进制
字节 Byte (B) 1 B = 8 bit 基本存储单位 8 位二进制 = 2 位十六进制
千字节(十进制) KB 1 KB = 1000 B SI 单位 十进制
千二进制字节 KiB 1 KiB = 1024 B IEC 二进制单位 二进制
兆字节(十进制) MB 1 MB = 1000 KB SI 单位 十进制
兆二进制字节 MiB 1 MiB = 1024 KiB IEC 二进制单位 二进制
吉字节(十进制) GB 1 GB = 1000 MB SI 单位 十进制
吉二进制字节 GiB 1 GiB = 1024 MiB IEC 二进制单位 二进制
太字节(十进制) TB 1 TB = 1000 GB SI 单位 十进制
太二进制字节 TiB 1 TiB = 1024 GiB IEC 二进制单位 二进制

注意:

  • KB 严格按十进制:1000 字节。
  • KiB 严格按二进制:1024 字节。
  • 但很多软件/老习惯里写“KB”实际按 1024 算,所以看到 KB 要结合上下文判断。

3. 传输单位

下表把 SI 十进制单位与 IEC 二进制单位并列,便于对照;网络速率通常用十进制,操作系统显示容量常用二进制。

类别 单位 符号 换算关系 说明
传输速率 比特每秒 bps 1 bps = 1 bit/s 网络带宽常用单位
传输速率 千比特每秒 Kbps 1 Kbps = 1000 bit/s 网络速率通常用十进制
传输速率 兆比特每秒 Mbps 1 Mbps = 1000 Kbps 常见宽带/网络速率
传输速率 吉比特每秒 Gbps 1 Gbps = 1000 Mbps 高速网络速率
传输速率 太比特每秒 Tbps 1 Tbps = 1000 Gbps 骨干网/高速网络
传输速率 字节每秒 B/s 1 B/s = 8 bit/s 文件下载速度常用
传输速率 千字节每秒(十进制) KB/s 1 KB/s = 1000 B/s SI 单位
传输速率 千二进制字节每秒 KiB/s 1 KiB/s = 1024 B/s IEC 二进制单位
传输速率 兆字节每秒(十进制) MB/s 1 MB/s = 1000 KB/s 硬盘/下载速度常用
传输速率 兆二进制字节每秒 MiB/s 1 MiB/s = 1024 KiB/s IEC 二进制单位
传输符号率/调制速率 波特 Baud(Bd) 1 Bd = 1 symbol/s 每秒传输的符号数;不等于 bit/s

注意:

  • 小写 b 表示 bit(比特),大写 B 表示 Byte(字节);1 Byte = 8 bit。
  • 网络传输速率通常使用十进制:1 Kbps = 1000 bps;操作系统显示存储容量时常使用二进制:1 KiB = 1024 B。
  • 波特率(Baud rate)表示每秒传输多少个“符号”,单位是 Bd;比特率表示每秒传输多少个 bit,单位是 bps。
  • 核心关系:比特率 = 波特率 × 每个符号携带的比特数。例如 QPSK 每符号 2 bit,则 2400 Bd = 4800 bps。
  • 波特率本来单位为波特(Baud),意为码元/s。而 bp/s 是比特率的单位,但是在二进制调至下,波特率的值 = 比特率的值,所以两者经常会混为一谈。
  • 二进制调制/UART 常见场景下每符号约 1 bit,所以“9600 波特”常被近似理解为 9600 bps,但严格说 Baud 和 bps 概念不同。

4. 数据类型

说明:

  • 1 字节(byte) = 8 位(bit)
  • C 标准只规定了各类型的最小大小与相对大小关系(如 sizeof(char) == 1、sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)),具体字节数由编译器和平台(数据模型)决定。
  • 表中“典型字节数”以常见平台为准:32 位平台(ILP32)、64 位 Linux/macOS(LP64)、64 位 Windows(LLP64)。
  • 可用 sizeof(类型) 查看当前平台实际大小,单位为字节。

4.1 基本数据类型

数据类型 说明 典型字节数 位数 典型取值范围 / 精度
_Bool / bool(C99,需 <stdbool.h>) 布尔类型(存储 1 字节,取值仅用 1 位) 1 8 0 或 1
char 字符型(符号性由实现定义) 1 8 -128 ~ 127 或 0 ~ 255
signed char 有符号字符 1 8 -128 ~ 127
unsigned char 无符号字符 1 8 0 ~ 255
short / short int / signed short 短整型 2 16 -32,768 ~ 32,767
unsigned short / unsigned short int 无符号短整型 2 16 0 ~ 65,535
int / signed int 整型 4 32 -2,147,483,648 ~ 2,147,483,647
unsigned int / unsigned 无符号整型 4 32 0 ~ 4,294,967,295
long / long int 长整型 4(32位 / 64位 Windows)8(64位 Linux/macOS) 32 / 64 取决于平台
unsigned long 无符号长整型 4 或 8 32 / 64 取决于平台
long long / long long int(C99) 长长整型 8 64 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
unsigned long long(C99) 无符号长长整型 8 64 0 ~ 18,446,744,073,709,551,615
float 单精度浮点(IEEE 754 binary32) 4 32 ±3.4×10³⁸,约 6~7 位有效十进制数字
double 双精度浮点(IEEE 754 binary64) 8 64 ±1.7×10³⁰⁸,约 15~16 位有效数字
long double 扩展精度浮点 8(MSVC)16(x86 Linux,80 位扩展精度 + 填充) 64 / 80 / 128 实现定义,≥ double 精度;80 位精度常存于 16 字节
float _Complex(C99) 单精度复数(实部 + 虚部) 8 64 两个 float 的总位数
double _Complex(C99) 双精度复数(实部 + 虚部) 16 128 两个 double 的总位数
long double _Complex(C99) 长双精度复数(实部 + 虚部) 16 / 24 / 32 128 / 192 / 256 两个 long double 的总位数
void 无类型 / 不完整类型 无大小(不可 sizeof) — 仅作函数返回/参数或指针目标类型

4.2 定宽整数类型

(stdint.h,C99)

数据类型 说明 典型字节数 位数 取值范围
int8_t / uint8_t 精确 8 位整数 1 8 -128 ~ 127 / 0 ~ 255
int16_t / uint16_t 精确 16 位整数 2 16 -32,768 ~ 32,767 / 0 ~ 65,535
int32_t / uint32_t 精确 32 位整数 4 32 -2.1×10⁹ ~ 2.1×10⁹ / 0 ~ 4.29×10⁹
int64_t / uint64_t 精确 64 位整数 8 64 ±9.22×10¹⁸ / 0 ~ 1.84×10¹⁹
int_leastN_t / uint_leastN_t 至少 N 位的最小类型 实现定义 ≥ N 实现定义
int_fastN_t / uint_fastN_t 至少 N 位的最快类型 实现定义 ≥ N 实现定义
intptr_t / uintptr_t 可容纳指针的有/无符号整数 4 或 8 32 / 64 与指针同宽
intmax_t / uintmax_t 最大宽度整数类型 通常 8 通常 64 标准只保证是最大宽度整数,取值同 long long

4.3 常用标准库类型

(stddef.h / stdint.h / time.h / wchar.h / uchar.h;ssize_t、off_t 为 POSIX)

数据类型 说明 典型字节数 位数 备注
size_t sizeof 的结果、无符号计数类型 4(32位)/ 8(64位) 32 / 64 无符号
ssize_t 有符号大小类型(POSIX) 4 / 8 32 / 64 非 ISO C 标准
ptrdiff_t 两指针相减的结果 4 / 8 32 / 64 有符号
wchar_t 宽字符类型 2(Windows)/ 4(Linux) 16 / 32 实现定义
char16_t(C11) UTF-16 代码单元 2 16 <uchar.h>
char32_t(C11) UTF-32 代码单元 4 32 <uchar.h>
time_t 日历时间 4 / 8 32 / 64 实现定义
clock_t 处理器时间 4 / 8 32 / 64 实现定义
off_t 文件偏移量(POSIX) 4 / 8 32 / 64 实现定义;可用 _FILE_OFFSET_BITS 影响

4.4 派生类型与复合类型

类型形式 说明 存储大小
指针 T * 数据指针 / 函数指针 4 字节(32位)或 8 字节(64位);与目标类型无关(但 void (*)(void) 与 void * 不保证等宽)
数组 T a[N] N 个 T 的连续序列 N × sizeof(T)(无填充)
结构体 struct 成员顺序存储 各成员大小之和 + 对齐填充(padding),满足最大对齐要求
联合体 union 成员共享同一块内存 最大成员的大小(再按最大对齐补齐)
位域 struct 按位分配 以“存储单元”计,实际占用取决于实现与成员布局
枚举 enum 整型常量集合 通常 4 字节(等同 int),可由编译器优化或指定底层类型
函数 T f(...) 函数类型 函数类型没有大小(sizeof 不适用),函数体占用代码段;取函数名得到函数指针
_Atomic T(C11) 原子类型 通常等于 sizeof(T),对齐可能更大

4.5 三种常见数据模型下的整型 / 指针宽度

数据模型 典型平台 int long long long 指针 size_t
ILP32 32 位 x86 / ARM 4 4 8 4 4
LP64 64 位 Linux / macOS / Unix 4 8 8 8 8
LLP64 64 位 Windows(MSVC) 4 4 8 8 8

4.6 快速记忆要点

  1. 最小存储单位是“位”(bit),基本单位是“字节”(Byte);1 字节 = 8 位;char 恒为 1 字节。
  2. 常用“固定”宽度:char=1、short=2、int=4、long long=8、float=4、double=8。
  3. 常见会随平台变化的包括 long、指针、size_t、ptrdiff_t、wchar_t、long double、time_t、off_t 等,32/64 位间可能不同。
  4. 需要跨平台确定性宽度时,优先使用 <stdint.h> 的 intN_t / uintN_t。
  5. 需要表示大小或下标时用 size_t;需要指针差值时用 ptrdiff_t。
  6. 结构体存在内存对齐填充,sizeof(struct) 可能大于成员大小之和。

博客导航

博客导航

posted @ 2026-10-27 21:38  膝盖中箭卫兵  阅读(9)  评论(0)    收藏  举报
ORCID iD icon https://orcid.org/0000-0001-5102-772X