2017-07-07 28 views
-2

我正在閱讀一些關於C語言內存地址和數據類型的論文,我一直在很好地理解內容,但是我偶然發現了一些數學,而且我似乎無法想象它出在互聯網上的任何地方。內存地址和數據類型介紹

假設我創建了兩個局部變量

void foo(void){ 
    int i, j; 
    printf("int i is stored in %p\n", &i); 
    printf("int j is stored in %p\n", &j); 
} 

我得到的輸出是

int i is stored in 0x6ffc88 
int j is stored in 0x6ffc84 

,並在文本我讀,一個整數大小的4個字節(同樣與我的計算機)。所以,int i應該分配4個字節。但int iint j的存儲器地址之間的差異僅爲4位(0100)。

差異不是意味着更大的東西,比如4個字節(0xffffffff)?

請問我在哪裏混淆?

+2

int i和int j的內存地址之間的差異僅爲4位 - 不,這些是字節地址。 – ThingyWotsit

+3

地址是字節地址。 C不允許位尋址。 –

+0

大多數CPU都是字節可尋址的。 C可以與CPU通話並請求以字節而不是位執行的內存讀取/寫入操作。使用C語言,我們可以至少逐字節地讀/寫內存位置,儘管在讀取並將其放在一個整數變量中後,我們可以用這些>><<&位運算符 – EsmaeelE

回答

6

j位於字節地址0x6ffc84,0x6ffc85,0x6ffc86,0x6ffc87,所以是32位。

我位於字節地址0x6ffc88,0x6ffc89,0x6ffc8a,0x6ffc8b,所以,32位。

除了像8051這樣的微控制器恐懼之外,現代的非平凡處理器體系結構沒有位尋址存儲器。