【程序设计基础】存储单位、传输单位、数据类型
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 快速记忆要点
- 最小存储单位是“位”(bit),基本单位是“字节”(Byte);1 字节 = 8 位;
char恒为 1 字节。 - 常用“固定”宽度:
char=1、short=2、int=4、long long=8、float=4、double=8。 - 常见会随平台变化的包括
long、指针、size_t、ptrdiff_t、wchar_t、long double、time_t、off_t等,32/64 位间可能不同。 - 需要跨平台确定性宽度时,优先使用
<stdint.h>的intN_t/uintN_t。 - 需要表示大小或下标时用
size_t;需要指针差值时用ptrdiff_t。 - 结构体存在内存对齐填充,
sizeof(struct)可能大于成员大小之和。
博客导航
本文来自博客园,作者:膝盖中箭卫兵,转载请注明原文链接:https://www.cnblogs.com/hai-feng-dev/p/23459567

浙公网安备 33010602011771号
https://orcid.org/0000-0001-5102-772X