Math 为什么他们在编程时选择16、32、128这样的数字?

Math 为什么他们在编程时选择16、32、128这样的数字?,math,data-structures,types,storage,Math,Data Structures,Types,Storage,有时在代码中,我看到开发人员为一个数据包选择一个像32这样的数字。或者在游戏中,加载的地图地形大小为128*128点。 我知道这与数据类型的最大大小有关。就像一个字符有8位,等等。 但是为什么他们不直接用像100*100这样的数字来表示地图、列表或地雷阵块呢 如果我有8位来存储一个(正数),我可以数到2^8=256。 当我选择地图块的大小时,我可以选择250的宽度,而不是256的宽度。但这似乎不是一个好主意。为什么?有时开发人员会使用250或100之类的数字。这一点也不少见。(例如,1920出现

有时在代码中,我看到开发人员为一个数据包选择一个像32这样的数字。或者在游戏中,加载的地图地形大小为128*128点。 我知道这与数据类型的最大大小有关。就像一个字符有8位,等等。
但是为什么他们不直接用像100*100这样的数字来表示地图、列表或地雷阵块呢

如果我有8位来存储一个(正数),我可以数到2^8=256。 当我选择地图块的大小时,我可以选择250的宽度,而不是256的宽度。但这似乎不是一个好主意。为什么?

有时开发人员会使用250或100之类的数字。这一点也不少见。(例如,1920出现在许多屏幕分辨率中。)


但是像8、32和256这样的数字是特殊的,因为它们是2的幂。对于数据类型,如8位整数,此类型的可能元素数为2的幂,即2^8=256。各种内存边界、磁盘页等的大小与这些数字配合得很好,因为它们也是二的幂。例如,一个16384字节的页面可以容纳2048个8字节的数字,或者256个64字节的结构,等等。如果两个大小都是2的幂,那么开发人员很容易计算出一个大小的容器中可以容纳多少项,因为他们已经记住了很多数字。

前面的答案强调,具有这些大小的数据非常适合存储块,这当然是正确的。但是,它并不能真正解释内存块本身为什么有这些大小:


内存必须被寻址。这意味着必须计算给定数据的位置,并将其存储在内存中的某个位置,通常存储在CPU寄存器中。为了节省空间和计算成本,这些地址应该尽可能小,同时仍然允许尽可能多的内存被寻址。在二进制计算机上,这导致最佳内存或内存块大小为2的幂

还有另一个相关的原因:乘法和2的幂除法等计算可以通过移位和掩蔽位来实现。这比一般的乘法或除法更有效

例如:假设有一个16 x 16字节数组存储在从地址0开始的连续内存块中。要根据地址计算行和列索引,通常需要计算
row=address/num\u columns
column=address%num\u columns
(%表示整数除法的余数)

在这种特殊情况下,二进制计算机要容易得多,例如:

address:           01011101
mask last 4 bits:  00001101 => column index
shift right by 4:  00000101 => row index

因为当一切都基于二进制
0
s和
1
s时,二的幂很重要。一个跨站点复制,令人惊讶:128*128正好是16kb。在页面边界处很好地对齐,这可能很重要。因为计算机只有两个手指,称为0和1。10、100、1000对你来说是圆的,因为你有十个手指。想象一下我们的世界是多么美好:每小时64分钟,每公里1024米,每只手4个手指……它们被称为“为了节省空间和计算成本,这些地址应该尽可能小,同时仍然允许尽可能多的内存被寻址。”评论不错,+1