2015-06-03 78 views
3

我的電腦是64位的mac。我的64位機器每個內存位置只能存儲4個字節

在內存中的這些位置之一中存儲了多少個字節的信息?

當我在gdb試過的東西

x /2x first 
0x7ffff661c020: 0xf661b020  0x00007fff 

我的代碼是

#define PUT(p, val) (*((size_t *)(p)) = (val)) 
PUT(first, (size_t)some pointers); 

我用gcc -g編譯

似乎只有4個字節商店0x7ffff661c020。 0x00007fff存儲在0x7ffff661c024中。爲什麼它不能在0x7ffff661c020中存儲0x00007ffff661b020。

感謝

回答

8

每個內存位置只能存儲八位,是因爲內存字節尋址。 64位機器在每個存儲器位置都不會給你64位,它只是意味着它一次可以自然處理64位數據。

例如,寄存器是64個位寬(除非有意操縱子寄存器像axeax代替64位rax),並且可以從存儲器用一條指令裝入許多比特。

你可以看到,它的字節尋址的事實,你的兩個地址有四個它們之間的區別:

0x7ffff661c020: 0xf661b020 
0x7ffff661c024: 0x00007fff 
       \____________/ four-byte 
          \ difference 

,如果你使用基於字節的輸出,你會看到更多的「自然」,如:

(gdb) x/8xb first 
0x7ffff661c020: 0x20 0xb0 0x61 0xf6 0xff 0x7f 0x00 0x00 

因此,在0x7ffff661c02064位值是實際上0x00007ffff661b020如預期,你只需要調整gdb命令把它作爲一個完整的64位值,是這樣的:

x/1xg first 

其中1xg意味着一個值,十六進制格式,巨字(八個字節)。在x命令的詳細信息,可以發現here,爲您的問題重要的一點是單位的大小(我的粗體)的說明:

  • b =字節。
  • h =半字(兩個字節)。
  • w =單詞(四個字節)。 這是初始默認值。
  • g =巨詞(八個字節)。
+0

謝謝,真的有幫助。我甚至懷疑我的代碼完全錯誤。 –

+0

小問題,目前有些處理器不是「字節可尋址」的處理器,它們往往是嵌入式處理器(例如DSP),在這種處理器中,每桶滾筒是一塊非常大的硅片(例如乘以一千個處理器)。 – user3710044

3

似乎只有4個字節商店0x7ffff661c020

不,你問過GDB給你存儲在位置0x7ffff661c020 4個字節,所以這也正是它給了你。試試這個:

(gdb) x/gx 0x7ffff661c020 
相關問題