1. 程式人生 > >【疑問與解答】地址的位數不是和作業系統有關嗎?為什麼我的是64位的作業系統,寫的C語言程式,裡面的變數地址是32位的?

【疑問與解答】地址的位數不是和作業系統有關嗎?為什麼我的是64位的作業系統,寫的C語言程式,裡面的變數地址是32位的?

問:地址的位數不是和作業系統有關嗎?為什麼我的是64位的作業系統,寫的C語言程式,裡面的變數地址是32位的?


答:你說你的系統是64位,但是,不知您的C編譯程式採用了什麼模式。
具體的C編譯程式有不同的模式,如“微模式”、“小模式”、“中模式”、“大模式”、“巨模式”等等。不同的模式中採用的地址資訊是不同的。在較小的模式中,沒必要採用全64位的地址資訊。因此程式中只保留32位地址資訊也是可能的。


追問:那這個32位地址的全地址怎麼算呢?


追答:不同的系統可能有不同的處理方式。不瞭解您所用的具體系統。但可以舉一個例子說明道理。


某個32位地址系統的計算機中的C語言的“微模式”,整個程式的工作空間不超過64K,所以內部只保留16位的地址資訊。編譯好的程式是可以放在任何一個64K的段中執行的。具體放到哪個段,則在裝入執行前由作業系統自動安排,轉入執行前設定好“程式碼段”的“段暫存器”,程式執行中間不改動“程式碼段”,就行了。
在這個系統中,要想知道它的實際的“全地址”,則需要看“段暫存器”的當前內容。


追問:那就是說這個32位地址是偏移地址?全地址 = 段地址+偏移地址?


追答:不同的系統可能有不同的處理方式。例如8086系統中,通常是:
全地址 = 段暫存器內容×16 + 偏移地址
而別的系統中可能又有別的規則。

至於win7 64位段地址,特別是您所用的C編譯程式模式中的地址關係,則需要分別查閱有關的資料。