在做题过程中会遇到一些空间限制,如下图的“内存限制”为128MB。这个128MB就限制了如果我们不开栈、没有递归、只开int数组的情况下,只允许将数组开到 1 0 7 10^7 107这样的数量级。这个数字是怎么得到的呢?
前置知识
表示内存大小的几个单位
内存的最小单元是一根导线,我们可以用通电来表示1,断电来表示0,也就是一根线只能表示两个数字,故内存使用的是二进制。我们将一根线称作一个二进制位(1 bit)
表示内存大小的单位有:bit、Byte、KB、MB、GB、TB
其中部分单位解释如下:
单位 | 含义 | 名称 | 换算 |
---|---|---|---|
bit | 一个二进制位 | 比特 | |
Byte | 八个二进制位 | 字节 | 8 bit = 1 Byte |
KB | 1024个字节 | 千字节 | 1024 Byte = 1 KB |
MB | 比KB高一级的单位 | 兆字节 | 1024 KB = 1 MB |
就像时间的单位时分秒一样,秒进位以后就是分,分进位以后是小时。我们的内存单位也有相应进位的关系。除了 bit 到 Byte 是八进制以外,其余进制都是 2 10 = 1024 2^{10} = 1024 210=1024
常见的数值类型
数据类型 | 一个该类型变量占据的内存 | 存储方式 | 能表示的最大数字(量级) |
---|---|---|---|
int | 32位二进制位(32 bit) | 第一个二进制位为符号位,该位为0表示正数,为1表示负数,其余位置存储实际数字 | 2 31 − 1 = 2147483647 2^{31} - 1 = 2147483647 231−1=2147483647 |
long long | 64位二进制位(64bit) | 同上 | 2 64 − 1 2^{64} - 1 264−1 |
double | 64位二进制 | 科学计数法存储。第一个二进制位为符号位,接下来11位存储科学计数法中10的指数部分。余下的53位存储小数部分(见下图图解) | 1 0 308 10^{308} 10308 |
double类型的存储方式:
根据空间限制计算允许的数组大小
空间限制为 512 M B 512MB 512MB的时候,如果不开栈、无递归、只开一个int数组,那么这个数组可以开到多大的量级?
首先转换MB为bit:空间限制为 512 × 1024 × 1024 × 8 512\times1024\times1024\times8 512×1024×1024×8 bit
然后我们知道一个int类型占据32bit,所以允许开出的数组大小为: 512 × 1024 × 1024 × 8 32 = 128 × 1024 × 1024 ≈ 1 0 8 \frac{512\times1024\times1024\times8}{32} = 128\times1024\times1024 ≈10^{8} 32512×1024×1024×8=128×1024×1024≈108
练习题
空间限制为 128 M B 128MB 128MB的时候,如果不开栈、无递归、只开一个double数组,那么这个数组可以开到多大的量级?
长度为 1 0 7 10^7 107的double类型数组占多少空间?(说出数量级即可)
答案评论区见