我了解到8086 CPU具有16位数据总线,而Pentium CPU具有32位数据总线,这意味着每个内存地址都具有数据总线的大小。

例如:

16bit = 2^16 = 65,536
binary 0000 0000 0000 0000 ~ 1111 1111 1111 1111
hex    0000 0000 ~ FFFF FFFF
dec    000,000 ~ 65,535

65,536 / 1024 = 64 so can be 64kbyte of maximum memory address.
like 0x 0000,0000 ~ 0x FFFF,FFFF


32bit = 2^32 = 4,294,967,296
binary 0000 0000 0000 0000 0000 0000 0000 0000
~ 1111 1111 1111 1111 1111 1111 1111 1111
hex    0000 0000 0000 0000 ~ FFFF FFFF FFFF FFFF
dec    0,000,000,000 ~ 4,294,967,296

4,294,967,296 / 1024 / 1024 = 4 so can be 4mb of maximum memory address
like 0x 0000,0000,0000,0000 ~ 0x FFFF,FFFF,FFFF,FFFF


我对么?我认同。但是在C编程中:

int arr[2];
printf("%p %p \n", &arr[0],&arr[1]);
-----------------------------------
0x 7fff5c474b20,  0x 7fff5c474b24  (this is 64bit addressing)


我知道整数是4个字节。
&arr[1]-&arr[0]的大小为0x4,这意味着每个地址仅包含8位数据总线。

如果CPU可以容纳8bit以上,为什么C仅容纳8bit?

最佳答案

糟糕,事情与您所写的不完全相同-我谈论的是8086(我已经足够大,可以使用它了……)。您可以在wikipedia上找到更多参考资料)


数据总线为16位宽,这意味着一次可以传输2个字节
地址,但为20位宽,表示内存地址的范围为0-0xFFFFF或1M


8086使用的基于寻址模式:地址由段(16位寄存器)和偏移量表示,实际地址为segment * 16 + offset-btw,地址具有不同的表示形式,例如0x20010可以表示为2000:0010或2001: 0000 1FFF:0020

而且... 8086上没有64位寻址模式!

现在对于您的实际问题,C指定最小的可寻址内存应为char或字节,并且单个char必须包含所使用的字母(来自C语言源)中的任何字符(大写和小写字母,数字以及某些符号,因此在至少7位)。通用处理器(我所知道的全部)使用8位字节寻址,与总线大小无关。这意味着连续地址是连续字节的地址。

数据总线的宽度为16、32或64位这一事实仅允许一个内存访问就可以在单个操作中分别加载2、4或8个字节。某些处理器(例如ARM)需要多字节的内存访问才能正确对齐:例如,您只能在偶数地址上读取16位字,而任何尝试从奇数地址读取16位字的尝试都将导致处理器陷阱。

请记住,没有任何东西(简单性除外)会迫使处理器设计者拥有相同大小的数据总线和地址总线。

关于c - 数据总线和解决内存困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38303050/

10-14 02:11