❶ 編譯器的工作原理
編譯 是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器語言)的翻譯過程。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。
典型的編譯器輸出是由包含入口點的名字和地址, 以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的EXE,
所以我們電腦上的文件都是經過編譯後的文件。
❷ 用dev-c++編譯器對C語言程序進行編譯有什麼局限性
首先,Dev-C++不是編譯器,僅僅是編譯環境。
其次,Dev-C++用的編譯器是在Windows環境下模擬Linux G++的MinGW,據說G++是完全標準的C++編譯器。
但模擬後因為系統不完全兼容,編譯出的結果在Windows環境下不如VC++編譯結果快。寫C的話,因為是C++兼容C,速度達不到最優。如果對程序結果質量有高要求的話,建議換Turbo C這款經典的C編譯器。(用C++編譯器影響不大,基本上1000000以內語句執行次數,或者說1000行代碼以內看不出明顯區別)
❸ 大小端轉換的原因
這是因為在計算機系統中,我們是以位元組為單位的,每個地址單元都對應著一個位元組,一個位元組為8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於寄存器寬度大於一個位元組,那麼必然存在著一個如何將多個位元組安排的問題。因此就導致了 大端存儲模式 和 小端存儲模式 。
例如一個16bit的short型x,在內存中的地址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。對於大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,剛好相反。我們常用的X86結構是小端模式,而KEIL C51則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬體來選擇是大端模式還是小端模式。
• Little-Endian:低位位元組排放在內存的低地址端,高位位元組排放在內存的高地址端。示例數字0x12 34 56 78在內存中的表示形式:
內存 低地址 -----------------> 高地址
0x78 | 0x56 | 0x34 | 0x12 *
低位子節 -----------------> 高位子節*
• Big-Endian:高位位元組排放在內存的低地址端,低位位元組排放在內存的高地址端。示例數字0x12 34 56 78在內存中的表示形式:
內存 低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78
高位子節 -----------------> 低位子節
注釋:
對於大小端的幾個結論:
1.char型變數和char型數組沒有大小端的區分。
2.需要轉化數據類型大於1個位元組的數據類型:short,int,枚舉,聯合體等。
簡單說一下為什麼要進行大小端轉化:目前我接觸到的,arm是小端,dsp是大端,電腦是小段,網路數據一般為大端,當arm需要和dsp通信的時候就會存在大小端轉化的問題,每種晶元為什麼選用大小端的由來就不贅述了。
1,舉例說明位元組間的大小端:
內存中有如下一段數據(unsigned int 型),不同的大小端對這個段數據的理解不同,所以在我們實際工作中,當你查看到內存中的數據時候,首先要清楚這個處理器的大小端,才能理解這段數實際代表的值。
如果是大端處理器:這段數代表:0x12345678;
如果是小段處理器:這段數代表:0x78563412 ;
內存中有如下一段數據(unsigned short 型):
如果是大端處理器:這段數代表的值:0x1234;
如果是小段處理器:這段數代表的值:0x3412 ;
在兩個不同大小端的處理器之間數據傳輸,數據再內存的存放順序並沒有變,不同大小端需要解讀出通用的值,就需要進行大小端轉化。
小端數據為:0x E4BDB9D7, 現將數據進行翻轉看,然後從底地址數據開始讀:
可以看出小端是從底地址的位元組的底bit位開始分配。
❹ 大端模式和小端模式
具體如下:
1、大端模式:
大端模式,是指數據的高位,保存在內存的低地址中,而數據的低位,保存在內存的高地址中,這樣的存儲模式類似於把數據當作字元串順序處理。
地址由小向大增加,而數據從高位往低位放;小端模式,是指數據的高位保存在內存的高地址中,而數據的低位保存在內存的低地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低,和我們的邏輯方法一致。
在大端模式下,前16位應該這樣讀: e6 84 6c 4e ( 假設int佔4個位元組)。
記憶方法: 地址的增長順序與值的增長順序相反。
2、小端模式例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000。
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000。
在小端模式下,前16位應該這樣讀: 4e 6c 84 e6( 假設int佔4個位元組)。
記憶方法: 地址的增長順序與值的增長順序相同。
大小端模式:
為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個地址單元都對應著一個位元組,一個位元組為 8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於 8位的處理器。
例如16位或者32位的處理器,由於寄存器寬度大於一個位元組,那麼必然存在著一個如何將多個位元組安排的問題。因此就導致了大端存儲模式和小端存儲模式。例如一個16bit的short型x,在內存中的地址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。
對於 大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,剛好相反。我們常用的X86結構是小端模式,而KEIL C51則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬體來選擇是大端模式還是小端模式。
❺ fortran編譯器相關 Fortran90用不同的編譯器編譯的程序對程序本身影響大嗎比如CVF與IVF!
CVF與IVF差別不大。對於一般的搞科學計算的,程序都是一些公式啊,數組啊什麼的。兩個編譯器都沒問題。
FORTRAN95看字面是比90要高級,實際上差不多。說白了,差別我們一般遇不到。沒事兒。
❻ 編譯器能指定大小端么
大端模式,是指數據的高位元組保存在內存的低地址中,而數據的低位元組保存在內存的高地址中
小端模式,是指數據的高位元組保存在內存的高地址中
而數據的低位元組保存在內存的低地址中
上面c是一個共用體,給共用體中的a賦值為1.然後讀取b是否為1,當b為1是說明是小端模式,b為0則說明是大端模式。