1. 程式人生 > >32位與64位 CPU、編譯器、作業系統、應用程式、arm和X86關係

32位與64位 CPU、編譯器、作業系統、應用程式、arm和X86關係

一:arm和X86的區別

arm:對應精簡指令集

X86:對應複雜指令集

arm上的和X86上編譯過的的東西是不能相互使用的,因為指令集不一樣嘛。指令集可以通俗的理解為,溝通語言。arm和X86之間東西不能直接用,類似於一個美國人和一箇中國人各自只說自己的語言,那麼這兩個人是沒法溝通的。


二:32位和64位的區別

32位和64位是指CPU通用暫存器的位寬。32位的記憶體可定址範圍為4G,而64位理論支援的最大記憶體尋找範圍為1600TB(實際無法達到)

其實就是速度快了,快很多!


三:應用程式、編譯器、作業系統、CPU的關係

CPU的位數是固定的,64位和32位系統的CPU指令集和運算元位數等都不相同。

64位的CPU上執行的是64位的指令集,能裝32位的作業系統、64位的作業系統

32位的CPU上執行的是32位的指令集,能裝32位的作業系統、不能裝64位的作業系統


作業系統本身也是一個軟體,實際上可以看作一系列的指令流

32位的系統可以看成一系列32位的指令流

64位的系統可以看成一系列64位和32位的指令流


應用程式可以理解為目標檔案(在linux上是ELF格式),也就是一堆機器指令

顯然,64位的CPU上能跑32位的應用程式,能跑32位的應用程式

32位的CPU能跑32位應用,不能跑64位應用。

總之:64位的系統或者64位的應用程式都要對應64位的指令,而這隻能對應64位CPU

  硬體是軟體的基礎。


注:cpu多少位和作業系統、驅動的關係:

作業系統和驅動應該保持位數一致

四、開發工具和位數的關係
VS可以都是32位的,沒有64位的但32位的VS可以開發x64和x86的程式。

應用程式和所呼叫的庫的位數要一致,不能混用64位和32位的程式碼,比如不能在64位的應用程式上呼叫32位的動態連結庫,反之亦然。可以用depends來檢視dll的呼叫,以及(0xc000007錯誤)

在VS中如何判斷編譯環境是64位還是32位(用於跨平臺應用)
在 Win32 配置下,_WIN32 有定義,_WIN64 沒有定義。在 x64 配置下,兩者都有定義。即在 VC 下,_WIN32 一定有定義。
因此,WIN32/_WIN32 可以用來判斷是否 Windows 系統(對於跨平臺程式),而 _WIN64 用來判斷編譯環境是 x86 還是 x64
---------------------  

原文:https://blog.csdn.net/qq_38880380/article/details/77774383