浅析内存地址如何编码

#include 

// 浅析内存地址如何编码

int main()
{
	/*
	内存地址编码:
	假设现在有一块内存条,具体多大未知,设为xGB大小,CPU要读取其中的1小块数据。
	读取的设计原理是这样的:
	把这xGB大小的内存条当成一幢楼房。把要读取其中的1小块数据当作房间(称其为最小内存单元),这个最小内存单元规定为1字节。
	至于为什么最小内存单元不规定为1bit是因为实在不方便也没必要。就像你去超市买大米,能说我买10粒大米吗?虽然粒确实是大米的最小单位。	都说我买10斤大米,这个斤就认为是买大米的最小单位了。
	|-----------------------
	|[1字节][1字节]...[1字节]|
	|[1字节][1字节]...[1字节]|
	|[1字节][1字节]...[1字节]|
	|[1字节][1字节]...[1字节]| ->xGB大小的内存条(大楼)
	|[1字节][1字节]...[1字节]|
	|....                  |
	|[1字节][1字节]...[1字节]|
	|----------------------|
	现在我们要给这些1字节的房间编个门牌号码了,这样有利于CPU的读取啊。(若是没有门牌号的话就得从一层循环到顶层来查找了,这谁受得了啊)
	[1字节] [1字节] [1字节] [1字节] ... [1字节] [1字节] [1字节] ... [1字节] [1字节] ...  [1字节]
	   0      1       2      3   ...    e      f       10  ...  ff2d    ff2e  ...    ????  ->  这里我们用16进制来代表房间的门牌号码
	现在又出现一个问题了,这个门牌号码的个数能是无限大的吗?
	xGB大小的内存总共可以有多少个房间呢?我们算一下。
	xGB = x*1024MB = x*1024*1024KB = x*1024*1024*1024B
	我们的门牌号码个数能够大于或等于这个x*1024*1024*1024数吗?也就是说能为所有的房间都安排一个门牌号码吗?
	答案是:不好说啊
	说这个之前先得了解【32位操作系统与64位操作系统】的概念。
	32位操作系统:指计算机系统中处理器和操作系统使用的32位数据单元,它们能处理32位宽度的数据。
		由于地址总线宽度为32位,最大内存寻址能力为4GB(2的32次方),即只能访问或使用不超过4GB的内存。
		我们解读一下上面的话【地址总线宽度为32位,最大内存寻址能力为4GB】
		【地址总线宽度为32位】为什么【最大内存寻址能力为4GB】呢?
		我们看一下32位二进制的变化:
		最小值: 00000000 00000000 00000000 00000000
		最大值: 11111111 11111111 11111111 11111111 -> 4294967295(转换为10进制)
		也就是说【地址总线宽度为32位】代表可以有4294967296个门牌号码啊!
		(因为我们是从0开始算的,因此最大值还得加1,即 4294967295+1=4294967296(即2的32次方))
		请注意这个4294967296是门牌号码的个数,不是bit啊,一个门牌号码是1字节大小,因此4294967296的单位是B。我们换算一下啊
		4294967296B = 4194304KB = 4096MB = 4GB
		因此我们就知道了【地址总线宽度为32位,最大内存寻址能力为4GB】的由来了。
		现在开始给房间编写门牌号码了
		门牌号0: 00000000 00000000 00000000 00000000 -> 0x00000000
		门牌号1: 00000000 00000000 00000000 00000001 -> 0x00000001
				...
				11111111 11111111 11111111 11111110 -> 0xfffffffe -> 4294967294(转换为10进制)
		门牌号n: 11111111 11111111 11111111 11111111 -> 0xffffffff -> 4294967295(转换为10进制)
				门牌号码分配完毕。
		也就是说一句话,你物理内存可以无限大,但我却只能给4294967296个房间发放门牌号码,即我32位操作系统每个CPU指令只支持4GB大小的内存,
		多了我也不认,还是去找64位操作系统吧。
	64位操作系统:略略
	*/

	int value = 233;
	printf("%p\n", &value);

	return 0;
}

浅析内存地址如何编码_第1张图片

浅析内存地址如何编码_第2张图片

你可能感兴趣的:(C/C++语言,c语言)