数据总线和寻址内存混淆

Jeu*_*ark 2 c memory cpu addressing databus

我已经了解到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
Run Code Online (Sandbox Code Playgroud)

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

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

我知道整数是4个字节.大小&arr[1]-&arr[0]0x4指每个地址只保存8位数据总线.

如果CPU可以容纳8位以上,为什么C只能容纳8位?

Ser*_*sta 5

Oups ......事情并不完全是你所写的 - 我谈的是8086(我已经足够老了,已经和它一起工作了......).你会在维基百科上找到更多关于它的参考资料)

  • 数据总线宽度为16位,这意味着是可以在一个单一的操作传输2个字节
  • 地址,但是20个比特宽,这意味着该存储器地址在范围0 -或的0xFFFFF 1M

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

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

现在对于你的实际问题,C指定最小的可寻址内存应该是char或byte,并且单个char应包含所用字母表中的任何字符是C源(大写和小写字母,数字和一些符号,所以在至少7位).通用处理器(我所知道的)使用8位字节寻址,与总线大小无关.这意味着连续的地址是连续字节的地址.

数据总线为16,32或64位宽的事实简单地允许单个存储器访问在单个操作上分别加载2,4或8个字节.某些处理器(例如ARM)需要正确对齐多字节存储器访问:例如,您只能在偶数地址读取16位字,并且任何尝试从奇数地址读取16位工作都将导致处理器陷阱.

请记住,除了简单之外,没有任何东西会迫使处理器设计人员拥有相同大小的数据总线和地址总线.