【发布时间】:2016-07-11 09:06:15
【问题描述】:
我了解到 8086 CPU 有 16 位数据总线,奔腾 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?
【问题讨论】:
-
好吧,实际上你混淆了一些非常糟糕的东西。您不必写入完整的数据段,您可以写入单个字节(或读取它们)。地址之间的差异是 4 个字节(这意味着
int在该平台上是 32 位的)。 -
我没有得到 8 位的东西,因为 4 个字节是 32 位。 (每字节 8 位并不是那么具体)
-
你还在做进一步的基础转换错误(base 16 中的 32 位地址是 0000 0000 到 FFFF FFFF)
-
指针可以是任意宽度。它们可以是 32 位,甚至可以是 16 位,这取决于您实际编译程序的位置。此外,C 程序和机器代码之间的转换也很重要。
-
deer@Paul Stelian,是的 32 位 0-FFFF FFFF,谢谢您的纠正。如果 int i = 10;定位在内存地址0xaabb0000,它真的0xaabb0000 = 0000 0000 0xaabb0002 = 0000 0000 0000 0000 0000 0000 0000 0000 0000,就像使用4byte,但是什么我的点是0xaabb0000 can holl full 0000 0000 0000 1010?不能容纳32位数据总线?
标签: c memory cpu addressing databus