本帖最后由 小敏叫我来巡山 于 2017-11-7 22:30 编辑
一.计算机数据存储的基础知识
1.计算机存储器的基本单位 :
计算机中最小的存储单元是bit,也叫做位,表示两种状态,可以存储1或者0,它存在于物理内存上。
计算机使用8bit的块来作为最小可寻址的存储单位,这个存储单位叫做字节(Byte)。
从程序的视角来看,内存是一个非常大的字节数组,程序的虚拟地址即为每个子节在数组中的下标。
2.什么是机器字(word)?
一般来说,机器字是cpu内部总线的宽度。平常说的32位机和64位机,指的就是计算机机器字的长度
机器字长度决定了cpu一次运算能够处理数据的最大宽度,一般也决定了cpu所能访问内存的地址范围。
例如,32位机器字长的cpu一次传输的数据能表示的范围是0~2^32-1Byte,
那么如果想传输一次地址就能访问内存的话,内存的大小就不能超过这个范围,
这个范围就是我们平常说的程序的地址空间0~4G
机器字长对程序来说意味着什么?
举例来说,当程序prog.c被编译成32位程序时,可以在32位或者64位机器上运行
(大多数64位机器也可以运行32位机器编译的程序,这是一种向后兼容。)
当它被编译成64位程序时,那就只能在64位机器上运行。
因此,当我们将程序称为“32位程序”或者“64位程序”时,区别在于该程序是如何被编译的。
3.存储数据的字节顺序(大端和小端)
考虑我们要存储一个跨越多个字节的数据,例如int型数据。
为了我们能够正确的取出这个数据,我们需要确定两条规则:
1.选取哪个字节表示这个数据的地址,以便于我们知道从哪取出数据。
2.在这个数据存储区域的内部怎么排列这些字节,以便于我们把这些字节重新还原成数据。
关于第一条规则:在几乎所有的机器上,数据的地址都为所使用字节中最小的地址。
通常说的大端小端之分,就是关于怎么实现第二条规则,例如我们要存储0x01234567:
file:///C:/Users/SOLUTI~1/AppData/Local/Temp/enhtmlclip/Image.png
通俗的说法,小端就是低地址存储低位,高地址存储高位,大端正好相反。
定义比较麻烦,大家可以从图中自行体会。
注意,计算机中数据存储是大端字节序还是小端字节序,是由cpu决定的,
例如,通常intel的cpu采用的是小端字节序。
说了这么多理论,我们来写段代码验证下自己的机器是什么字节序吧:
int is_little_endian(void) {
/* MSB = 0, LSB = 1 */
int x = 1;
/* Return MSB when big-endian, LSB when little-endian */
return (int)(*(char *)&x);
}
术语:LSB = Least Significant Bit 最低有效位
MSB = Most Significant Bit 最高有效位
|
|