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