主要内容 #
在今天的大师码课程中,我们来介绍一下内存大小的衡量单位。
1. 数据的单位 #
1.1 单位 #
计算机世界的数据大小,也和物理世界的长度一样,有自己的单位。
数据的最小单位是“位”(Bit),也就是一个 bool 变量所占的空间。
不过,由于“位”(Bit)太小,在使用上,我们习惯用另一个单位“字节”(Byte,简称 B),作为最小单位。
1 Byte = 8 Bits 1 字节 = 8 位
上一节课,我们计算了一个 int 的大小,是 bool 的 32 倍。
所以,一个 int 的大小是 4 字节。
除此以外,还有如下的常用单位:
1 KB = 1024 B // 下载速度,一般为:几百 KB/s 1 MB = 1024 KB // 一首歌曲的大小,一般为:几十 MB 1 GB = 1024 MB // 一部电影的大小,一般为:几 GB 1 TB = 1024 GB // 一些电脑的硬盘总容量为:几 TB
1.2 单位换算 #
在上面的描述中,需要特别注意的是单位间的比例,是 1024。
这里的 1024,是 2^10 。这也是和二进制有关。
2. 常见数据类型的长度(Win32为例) #
在不同的操作系统下,数据类型的长度会有差异。这里以 32 bit 的操作系统为例说明:
1 整型 #
类型名称 | short | int | long | long long | unsigned short | unsigned int | unsigned long | unsigned long long |
所占字节数 | 2 Bytes | 4 Bytes | 4 Bytes | 8 Bytes | 2 Bytes | 4 Bytes | 4 Bytes | 8 Bytes |
表示范围 | -32768~32767 | -2147483648~ 2147483647 |
-2147483648~ 2147483647 |
-9223372036854775808~ 9223372036854775807 |
0~65535 | 0~ 4294967295 |
0~ 4294967295 |
0~ 18446744073709551615 |
表示范围(十六进制) | 0x0000~0xFFFF | 0x00000000~ 0xFFFFFFFF |
0x00000000~ 0xFFFFFFFF |
0x0000000000000000~ 0xFFFFFFFFFFFFFFFF |
0x0000~0xFFFF | 0x00000000~ 0xFFFFFFFF |
0x00000000~ 0xFFFFFFFF |
0x0000000000000000~ 0xFFFFFFFFFFFFFFFF |
- 十六进制的两位,占据 1 Byte;
- 只有 unsigned 类型,十六进制的表示范围,和十进制的表示范围,是一一对应的;
2 实型 #
类型名称 | float(中文翻译:单精度) | double(中文翻译:双精度) | long double | bool |
所占字节数 | 4 Bytes | 8 Bytes | 16 Bytes | * 1(=8 Bits) Byte,见说明 |
表示范围 | -3.4E+38~3.4E+38 | -1.7E+308~1.7E+308 | -3.4E4932~3.4E4932 | true / false |
表示范围(十六进制) | 0x00000000~ 0xFFFFFFFF |
0x0000000000000000~ 0xFFFFFFFFFFFFFFFF |
0x0~ 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF |
在C++中,bool 其实也是占一个字节(8 位)。这是比较特殊的地方。
3 字符型 #
* 字符型还未介绍,将在后续章节讲解。
类型名称 | char | unsigned char |
所占字节数 | 1 Byte | 1 Byte |
表示范围 | -128~127 | 0~255 |
表示范围(十六进制) | 0x00~ 0xFF |
0x00~ 0xFF |
由于,在不同机器上,数据的长度会有不同。所以,C++ 给了一个方法,用于查询变量(或者类型)的长度,单位“字节 Bytes”。
cout << sizeof(int) << " Bytes" << endl; cout << sizeof(float) << " Bytes" << endl; cout << sizeof(double) << " Bytes" << endl; cout << sizeof(short) << " Bytes" << endl; cout << sizeof(unsigned int) << " Bytes" << endl; int dashima(5); cout << sizeof(dashima) << " Bytes" << endl;