跳至正文
View Categories

1 min read

主要内容 #

在今天的大师码课程中,我们来介绍一下内存大小的衡量单位。

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;

习题 #

课后练习