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位?
Oups ......事情并不完全是你所写的 - 我谈的是8086(我已经足够老了,已经和它一起工作了......).你会在维基百科上找到更多关于它的参考资料)
基于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位工作都将导致处理器陷阱.
请记住,除了简单之外,没有任何东西会迫使处理器设计人员拥有相同大小的数据总线和地址总线.