字节(byte)是什么?
字节(byte)是由 8 个比特组成的数字数据单位,可以表示 256 个不同的值,范围从 0 到 255。在大多数计算机上,它是拥有独立地址的最小内存单位,文件大小也以字节为单位计算。
更新于 2026年9月24日
- 48H
- 69i
- 20␣
- F0 9F 98 80😀
4 个字符,7 个字节
字母 A 存储在你的电脑里时,是数字 65,而数字 65 是用八个比特存储的:01000001。这一组八个比特就是一个字节。内存地址按字节计数,文件大小按字节计数,编程语言里几乎每种数据类型的长度都是整数个字节。
为什么一个字节是 8 位
“byte”这个词是 Werner Buchholz 于 1956 年在参与 IBM Stretch 计算机项目时创造的。他特意用 y 来拼写,免得被误读为“bit”。早期计算机使用各种不同大小的分组,常见的是 6 位,足够表示大写字母和数字,却放不下小写字母。
IBM 在 1964 年发布的 System/360 采用了 8 位字节,整个行业随后跟进。八个比特能表示 256 个值,足以容纳大小写字母、数字、标点符号和控制码。8 还是 2 的幂,所以一个字节可以平均分成两个 4 位的半部分,每一半写成一位十六进制数字。网络标准在需要明确表示“恰好 8 位”时,至今仍使用“八位组”(octet)这个说法。
一个字节能存什么
一个字节有 256 种可能的模式,从 00000000 到 11111111。程序通常用以下几种标准方式来解读它:
- 0 到 255 之间的无符号数;
- -128 到 127 之间的有符号数;
- 一个字符,比如
A(65)或!(33); - 两位十六进制数字,从
00到FF。
Python 的 bytes 类型就是由这些值组成的序列,任何超出 0 到 255 的值都会被拒绝:
b'Hi!'
[72, 105, 33]
01001000 48
ValueError: bytes must be in range(0, 256)
并不是每个字符都能放进一个字节。UTF-8 是网络上最常用的编码,它用 1 个字节存储 128 个 ASCII 字符,其他字符则占 2 到 4 个字节:
A 1 bytes: [65] 41
é 2 bytes: [195, 169] c3a9
€ 3 bytes: [226, 130, 172] e282ac
😀 4 bytes: [240, 159, 152, 128] f09f9880
这就是为什么字符串的字符数和它的字节数可能不同。
比特与字节的区别
一个比特是单个 0 或 1,一个字节是 8 个比特。这两个单位很容易混淆,因为它们的符号只有大小写之分:
| 比特 | 字节 | |
|---|---|---|
| 是什么 | 一位二进制数字 | 8 个比特 |
| 可能的值 | 2 个(0 或 1) | 256 个(0 到 255) |
| 符号 | b(小写) | B(大写) |
| 通常用来衡量 | 网速:Mbps、Gbps | 存储和文件大小:KB、MB、GB |
| 示例 | 100 Mbps 的宽带 | 5 MB 的照片 |
要把比特换算成字节,就除以 8。100 Mbps 的宽带每秒最多传输 12.5 MB,所以用它下载一张 5 MB 的照片至少需要 0.4 秒。
KB、MB 和 GB
更大的单位有两套体系,正是两者之间的差距,让新硬盘在 Windows 里看起来比标签上写的小。
| 十进制(SI) | 字节数 | 二进制(IEC) | 字节数 |
|---|---|---|---|
| 千字节(kB) | 1,000 | KiB | 1,024 |
| 兆字节(MB) | 1,000,000 | MiB | 1,048,576 |
| 吉字节(GB) | 1,000,000,000 | GiB | 1,073,741,824 |
| 太字节(TB) | 1,000,000,000,000 | TiB | 1,099,511,627,776 |
硬盘厂商、网速以及 macOS(从 2009 年的 10.6 版开始)使用十进制单位。内存容量和 Windows 使用二进制单位,但 Windows 把它们标为 KB、MB 和 GB。IEC 在 1998 年引入了 kibibyte、mebibyte 和 gibibyte 这些名称来消除混乱,不过很多程序至今仍未采用。
1.0 TB (decimal, used on the box)
931.3 GiB (binary, what Windows calls GB)
12.5 MB per second
空间并没有丢失。硬盘确实装得下包装盒上承诺的一万亿字节,只是 Windows 连续三次除以 1,024,而不是 1,000。
代码中的字节
内存中的每个值都占用整数个字节。在 C 中,sizeof 会报告这个数字。按定义,char 恰好是 1 个字节;在当前的 64 位 Linux、macOS 和 Windows 系统上,short 是 2 个字节,int 是 4 个,double 是 8 个。因此,一个包含 1,000 个 int 值的数组占用 4,000 个字节。
printf("%zu\n", sizeof(int)); /* prints 4 */
Java 的 byte 类型始终是有符号的,范围从 -128 到 127,所以像 200 这样的值放不进去:
byte b = (byte) 200; // b is -56: the same 8 bits, read as signed
图片、压缩文件和网络数据包这类原始数据,都以字节数组的形式处理:Python 中是 bytes 和 bytearray,Java 中是 byte[],JavaScript 中是 Uint8Array。在 Python 中用 "rb" 模式打开文件,得到的是它的字节而不是文本。
哈希值和校验和也用字节来衡量。SHA-256 摘要是 32 个字节,所以打印出来是 64 个十六进制字符;CRC32 校验和是 4 个字节。哈希生成器可以为任意文本显示这两种值。
下一步学什么
想了解字节底下的单位,可以阅读比特是什么;想知道如何用字节检测损坏的文件,可以阅读校验和是什么。进制转换器能把任意字节在十进制、二进制和十六进制之间转换,C 语言数据类型指南列出了每种 C 类型占用的字节数。
常见问题
8 位的 11111111 叫什么?
11111111 是所有位都为 1 的字节。按无符号数读取,它是 255,也就是一个字节能存的最大值,十六进制写作 FF。如果按补码表示的有符号字节读取,同样的比特表示 -1。为什么 8 位等于 1 个字节?
8 是一个最终胜出的约定,而不是自然规律。IBM 在 1964 年发布的 System/360 采用了 8 位字节,此后几乎所有计算机都沿用了它。八个比特能表示 256 个值,足够容纳大小写字母、数字和符号;而且 8 是 2 的幂,能让硬件和运算保持简单。
4 个比特为什么叫 nibble?
nibble(半字节)就是半个字节,这个名字是个双关:byte 谐音 bite(咬一口),nibble 就是“小口咬”。四个比特能表示 16 个值,正好是一位十六进制数字,所以一个字节总是写成两位十六进制数,每个半字节对应一位。这个词有时也拼作 nybble。
1 个字节是 4 位吗?
不是。1 个字节是 8 位。4 位是半个字节,叫作半字节(nibble)。
字节和 GB 哪个大?
GB 大得多:在硬盘厂商使用的十进制体系中,1 GB 是 10 亿字节(1,000,000,000);在 Windows 使用的二进制体系中,则是 1,073,741,824 字节。字节是基本单位,KB、MB 和 GB 都是它的倍数。
一个字节长什么样?
01000001。这个模式表示数字 65,也是 ASCII 中字母 A 的编码。程序员通常把字节写成两位十六进制数字,所以 01000001 就写作 41。