當前位置:首頁 » 編程軟體 » small編譯模式下定義變數

small編譯模式下定義變數

發布時間: 2022-09-01 00:10:59

❶ 定義變數 占內存的多少

一個指針變數在內存中占兩個位元組(small模式編譯
一個指針變數在內存中佔四個位元組(32位機器上)
一般都是32位機器的,所以四個位元組咯。

❷ 51單片機定義變數時默認是存儲到哪裡的

未顯式聲明的情況下,變數會根據Memory Model的設置,默認分配在指定的存儲區。

  • Small模式:默認分配在data區

  • Compact模式:默認分配在pdata區

  • Large模式:默認分配在xdata區

新建工程默認都是Small模式,所以未顯式聲明存儲區域的變數都會分配在data區的。所以才會容易出現data區擠爆、編譯器跳著腳讓你把變數分到idata區去……

❸ C語言指針變數怎麼能表示任何內存地址.

你用的是16位的編譯器吧.(比如TC之類的)
你還沒學匯編(或者計算機原理之類)的吧.

80X86CPU在16位模式下,地址是靠兩個16位的2進制數表示的.就是 段地址 和偏移量 ,它們組合成20位的實地址能定址1M的空間(具體怎麼組合,有興趣了自己在網上看看).

你選擇的編譯模式是small(TC默認的,Model Small),只有一個數據段.所以段地址固定不變(在程序運行時等於一個常數.不需要表示),所以
char *p;
sizeof(p)==2 (這是個16位的偏移量)

如果你把編譯模式改成large或者huge
這個時候 char *p;
sizeof(p)就是 4 了,它包含了段地址和偏移量.

或者不管在什麼模式下,你直接聲明一個char far *p;
可以斷定sizeof(p) 是4
這也是char near *p 和char far *p 的不同.
char far* 是包含段地址和偏移量,
char near* 則只有偏移量.

small 模式下,默認char * 就是char near*
而large模式下, 默認char * 就是 char far*
(near和far編譯器幫你加上的)

段地址和偏移量組合後只有20位,所以在實模式下直接定址只有1M空間.(注意是【直接】能尋到的空間)

如果你接觸過dos(真正的dos而不是winxp下面的cmd),你就會知道,在沒有擴展內存和擴充內存的情況下,總共可利用的內存只有1M(不管你的內存條是多少M的),定址能力不行.
最後導致用戶可以用的內存只有600K左右.

如果有興趣的話,自己找點這方面的知識看看

❹ 為什麼Keil C中idata不能用,是不是要在哪裡設置一下

的確是RAM不夠了,因為你沒有把堆棧計算進去,所以雖然看起來小於256,但實際已經溢出。
從編譯結果來看,你有好幾個函數有實體但沒有調用,這樣是很浪費RAM的,因為KEIL因此會為這些函數中的局部變數都做了保留,相當於變成了全局變數來保存,如果你不想刪除這些函數,那就教你個辦法,在程序初始化階段:
i=0;
if(i)
{
...
不需要調用的函數;
...
}
這樣就能把RAM省下來了。
記住,嵌入式編程時,任何一個RAM空間都是十分寶貴的,可不能像PC程序那樣用啊。一些對性能要求不高的變數,或使用不頻繁的變數最好定義到XDATA中去。

❺ 關於單片機內存問題,DATA和XDATA具體是怎麼樣的

選擇small 模式你定義的變數默認為data模式,即變數存放與單片機的內部ram,而large模式下,定義的變數存放於外部ram。前者運算速度快於後者。

熱點內容
湖人雙核配置哪個最好 發布:2025-05-15 10:09:48 瀏覽:979
手機熱點密碼怎麼查看 發布:2025-05-15 09:54:47 瀏覽:108
生意發力雲存儲 發布:2025-05-15 09:54:45 瀏覽:616
編寫一個shell腳本添加用戶 發布:2025-05-15 09:54:43 瀏覽:505
資料庫查看錶命令 發布:2025-05-15 09:52:27 瀏覽:914
p30是不是自帶方舟編譯器 發布:2025-05-15 09:51:48 瀏覽:599
追擊世界房間密碼是多少 發布:2025-05-15 09:51:46 瀏覽:995
cjavabyte 發布:2025-05-15 09:51:36 瀏覽:463
visa存儲卡 發布:2025-05-15 09:35:07 瀏覽:619
js調用php的方法 發布:2025-05-15 09:29:13 瀏覽:496