1樓:
near指標和far指標?
在dos下(真實模式)地址是分段的,每一段的長度為64k位元組,剛好是16位(二進位制的十六位)。
near指標的長度是16位的,所以可指向的地址範圍是64k位元組,通常說near指標的定址範圍是64k。
far指標的長度是32位,含有一個16位的基地址和16位的偏移量,將基地址乘以16後再與偏移量相加,(所以實際上far指標是20位的長度。)即可得到far指標的1m位元組的偏移量。所以far指標的定址範圍是1m位元組,超過了一個段64k的容量。
例如一個far指標的段地址為0x7000,偏移量為0x1244,則該指標指向地址0x71224.如果一個far指標的段地址是0x7122,偏移量為0x0004,則該指標也指向地址0x71224。
如果沒有指定一個指標是near或far,那麼預設是near。所以far指標要顯式指定。far指標工作起來要慢一些,因為每次訪問一個far指標時,都要將資料段或程式段的資料交換出來。
另外,far指標的運算也比較反常,例如上面講到的far指標指向同一個地址,但是比較的結果卻不相同。
什麼時候使用far指標?
當使用小**或小資料儲存模式時,不能編譯一個有很多**或資料的程式。因為在64k的一個段中,不能放下所有的**與資料。為了解決這個問題,需要指定以far函式或far指標來使用這部分的空間(64k以外的空間)。
許多庫函式就是顯式地指定為far函式的形式。far指標通常和farmalloc()這樣的記憶體分配函式一起使用
2樓:
正解在dos下(真實模式)地址是分段的,每一段的長度為64k位元組,剛好是16位(二進位制的十六位)。
near指標的長度是16位的,所以可指向的地址範圍是64k位元組,通常說near指標的定址範圍是64k。
far指標的長度是32位,含有一個16位的基地址和16位的偏移量,將基地址乘以16後再與偏移量相加,(所以實際上far指標是20位的長度。)即可得到far指標的1m位元組的偏移量。所以far指標的定址範圍是1m位元組,超過了一個段64k的容量。
例如一個far指標的段地址為0x7000,偏移量為0x1244,則該指標指向地址0x71224.如果一個far指標的段地址是0x7122,偏移量為0x0004,則該指標也指向地址0x71224。
如果沒有指定一個指標是near或far,那麼預設是near。所以far指標要顯式指定。far指標工作起來要慢一些,因為每次訪問一個far指標時,都要將資料段或程式段的資料交換出來。
另外,far指標的運算也比較反常,例如上面講到的far指標指向同一個地址,但是比較的結果卻不相同。
c語言中一個關於near簡單問題
3樓:匿名使用者
給_systemaudio 聯合體,取了別名systemaudio
然後用systemaudio型別定義了一個near變數sysaudio
near是段內修飾符,在32位編譯器,near或者far沒有用處
4樓:匿名使用者
near、far、huge關鍵字的真正含義是什麼?
這三個關鍵字只能用於修飾函式、全域性變數和指標變數,對於非指標型別的區域性變數,這些關鍵字沒有實際意義。
這些關鍵字用於修飾函式時,huge的含義與far相同,用於指明該函式的呼叫方式為far呼叫方式,即呼叫時需要一個段值和一個段偏移組成的32bits呼叫地址,使用far call進行跳轉,跳轉前先壓棧儲存當前cs:ip。near修飾函式時,用於指明該函式的呼叫方式為near呼叫方式,呼叫時只需要一個16bits的近地址,即當前cs的段內偏移。
當這三個關鍵字用於修飾指標時,near型指標實質上為16bits的無符號整型數,該整數給出了所指向變數在當前資料段內的偏移地址,也就是說,在使用near型指標定址時實際上是進行如下的定址操作:[ds:指標變數值]。
對於far型的指標變數,可以定址1mb地址空間的任意一個地方,far型指標的實質是一個32bits的整型數,高16bits為段值,低16bits為段內偏移,turbo c中在使用far型指標時,會先將高16bits放入es暫存器中,然後再進行如下的定址操作:[es:指標變數低16bits值]。
對於hug型的指標變數,與far性指標變數的不同之處在於,在對far型指標變數進行+/++/-/--等操作時,far型指標變數保持段值不變(也就是高16bits),而只對段內偏移進行加減操作,所以會出現段內迴繞的現象,而huge型的指標,在進行加減操作時將會自動的改變段值,不會出現段內迴繞。所以給人的感覺就是huge指標能比far指標定址更大的記憶體空間。
c語言**現的far是什麼意思
5樓:
int far 或者 void far 表示要編譯器給宣告的這些量分配在 遠處的儲存器(ram)中,即分配到 64k 以外的 儲存地址中。
64k 作為一個「段」(segment),是 pc 機 80x86 時期的老概念。超過64k 就是 「遠」, far 就是 「遠」de 英文。
編譯器對near(近)和far(遠)的處理略有不同。
新的編譯器預設應當是遠。
6樓:枕著理想入睡
只不過是一個被定義的符號而已,作用和a、b、c那些是一樣的。為的是自己好認。
7樓:du瓶邪
近指標、遠指標,這是16位cpu造就的,但32位以上的cpu沒有。
16位cpu(主要指80386和80486)內部陣列匯流排為16位,地址匯流排為24位。這就意味著一個字(16bit)存不下一個地址,要用到兩個字。
習慣把高位字稱為段地址,低位字稱為偏移地址。
程式執行時,os會給程式分配幾個記憶體段供程式使用,主要的有**段(cs)、資料段(ds)、堆疊段(ss)。根據不同的編譯模式這幾個段可能重合。
當指標指向的地址與資料段的段地址相同(即處於資料段內),這時可以不記錄段地址而僅記錄偏移地址(只需16bit)。這種指標稱為近指標(near指標)。
當指標指向的地址與資料段的段地址不同(即處於資料段外),這裡不僅要記錄偏移地址還要記錄段地址(共需32bit)。這種指標稱為遠指標(far指標)。
可以測試:
sizeof(int near*)和sizeof(int far*)的返回值分別是2和4。
c 語言中變數定義為near
8樓:匿名使用者
這是歷史遺留問題,dos系統執行於intel的8086/8088這個16位cpu,但這cpu有20條地址匯流排,16位的暫存器就無法直接定址20位的地址,於是搞出來一個段偏移的概念,把1m的記憶體空間按64k分段, 以段地址+偏移地址的方式實現20位地址。cpu有許多預先設計好的段暫存器,程式執行的時候,存放在資料段暫存器(ds)中的段地址被當作一個預設的段地址,這64k空間就被稱為近程空間(near)。既然有近程空間,那麼就有遠端空間:
位於ds段以外的地址空間就叫遠端空間(far)。如果不顯式宣告,預設使用近程空間
unsigned char near variable; //在近程空間(ds段)建立一個變數 variable
unsigned char varible ; //沒有顯式宣告,同樣是near變數
對於unix/linux/windows這些32位作業系統,對記憶體的操作是線性的,也就沒有near和far的區別了
關於16位段記憶體的詳細內容,你可以參考8086/8088組合語言以及16位的c語言系統手冊(比如turbo c的程式設計師手冊)
9樓:匿名使用者
這個與c語言的功能無關, 只是基於硬體特性.
微控制器中, 因為指令長度及資料長度的cpu操作限制, 對於ram/rom位置的操作, 有些會區分 變數 距離 操作指令 其兩者之間的距離.
當距離較近, 也許單一指令就能存取, flash小, 且速度快.
當距離較遠, 會採取多指令組合, 或是佔時較久的操作指令來處理.
這個依照硬體特性不同而採用.
ps. 以上是個人印象, 如有訛誤歡迎指正.
c語言中函式前面的far是什麼意思
10樓:旁笑槐
如果學過彙編應該知道近指標和遠指標,far就是表示遠指標,其實還有關鍵字near,near表示16位定址,指標長度16位,far表示20位定址,指標長度20位。在32位系統中,記憶體管理為4g平坦模式,統一用32位指標,因此far和near僅僅是相容的需要。不少編譯器都直接這樣定義:
#define far
#define near
11樓:童童看熱點
關於孤島驚魂的十個事實!far cry到底是什麼意思
c語言中 》和 的區別,c語言中 a a 和 a 的區別
1 指向不同 一般情況下用 只需要宣告一個結構體。格式是,結構體型別名 結構體名。然後用結構體名加 加域名就可以引用域 了。因為自動分配了結構體的記憶體。如同 int a 一樣。而用 則要宣告一個結構體的指標,還要手動開闢一個該結構體的記憶體,然後把返回的指標給宣告的結構體指標,才能用 正確引用。否...
c語言中a 和 a的問題
靖健幸巍 在前先加1再進行運算,在前的運算級別比 優先順序高 在後先賦值再預算,在後的優先順序比 號優先順序低。第一次輸出結果為 a 5,b a 1 a 1 1 20 第二次輸出結果為 b a 1 a 1 16,a a 1 5 紀融雪貴鑠 inta 0 a 這個時候先賦值然後才加,所有a 0 a,先...
請教c語言中的問題,請教一個c語言中的問題?
不對int n n 意思是定義了一個指標變數n指向int型 n 等價於 n 就是先取n指向變數的值 然後讓n 1 n也就是讓n指向下一地址 而且這樣用必須先給n賦一個安全的地址才行 對啊,你用 幹什麼,有不是指標.就是 號自增 資深癩 int n n 或者int n n 以上都行 兩個的區別是 n ...