C 如何跨平台判斷作業系統是32位還是64位?

時間 2021-05-14 15:18:42

1樓:WhatIsSpin

2樓:

題主你這問題,成心折騰程式設計師。。

首先得說明一下,不呼叫系統API,又想知道與系統相關的東西,這就像你讓我進門拿東西,又把門鎖上不給我鑰匙一樣,正統方法是根本不可能做到的(且不深究這麼做有什麼意義,本來乙個很簡單的函式就能解決的問題繞個圈)。那就得走曲道破窗而入。

其次是跨平台不是語言本身的功能,是人為去調配的,根據已知的一些資訊,去把這個開關拔到win或是linux一端(或其他)。

然後sizeof指令是編譯平台相關的,他不是由當前作業系統的位數決定的,而是由通過編譯器期望生成的可執行檔案執行的作業系統決定的,即比如:我編譯器設定好目標的平台是64位win10,那麼sizeof求出來的位元組就和64位win10相匹配。

最後提供曲線進屋方案:

跨平台方法,由巨集決定,win下關鍵巨集_WIN32等等,linux關鍵巨集linux;

作業系統位數判斷方法提供乙個不穩定方案:由於64位系統與32位系統在系統檔案及系統資料夾上有所不同,由此可以進行對比判斷,如:win平台判斷系統根目錄有無program files(x86)資料夾來判斷,要是不保險可以多找幾個來判斷,同理linux下可以判斷有無/lib64來判斷。。

3樓:SuperFashi

首先,除了386和amd64之外還有其它架構。

接著假設你題中意思是指的編譯完的程式進行判斷。

最後下結論,既不能判斷CPU,又不能調API,那只能跟你說,沒有辦法了。sizeof是個常數,編譯期就定了,不可能隨著系統變化而變化。

當然如果是原始碼,那編譯器巨集或者sizeof(size_t)就完了。

4樓:

這個問題同C++沒什麼關係. 你沒有說清楚是執行時還是編譯期判斷, 兩者不同

1. 編譯期

編譯器會告訴目標平台的架構

sizeof是編譯器的常量

2. 執行期

程式當然知道是什麼平台, 因為不同CPU有不同的指令集, 乙個二進位制程式不能跨平台執行(x86程式不能執行在powerpc上)

同乙個平台的64位cpu一般會相容32位程式, 你可以判斷乙個32位的程式是否執行在64位cpu的Compatibility 模式下.

你不想使用系統呼叫. 就linux來說, 一種方式是利用32位程式在64位機器上的虛擬位址空間同真正32位CPU上的不同. Compatibility 模式下程式可用的位址空間接近4G, 但是32位機器上因為核心空間占用, 只能用2~3G

5樓:朱涵俊

你說的是作業系統,64位可以執行32位程式,因此sizeof是沒法判斷的。

跨平台要是cpu也要跨的話,沒辦法判斷。

即便限定x86cpu,也很難判斷。

6樓:「已登出」

假如你編譯了乙個 32 位 Windows 程式,它在 64 位 Windows 上跑仍然是以 32 位相容模式執行的,sizeof() 就不對了,它只是檢測編譯平台,而不是執行平台。

如果你用 Qt,這裡有乙個很便利的類 QSysInfo,用裡面的 currentCpuArchitecture() 方法:

QSysInfo Class | Qt Core 5.8

64位作業系統 CPU 如何相容32位程式 軟體 請看詳情。?

北極 要保證64位相容性,無非就是兩點 1.硬體相容 指令層面上 2.軟體相容 作業系統 因為以上兩點都能保證,所以自然32位程式能在相容32位程式的作業系統 CPU上跑。具體的形式 1.硬體相容 現有的x86架構的CPU,作業系統進入64位的工作模式都是相容32位的,即使在long mode模式下...

作業系統是如何顯示圖形介面的?

小牛 我和你一樣,都是非專業的,但是對這些比較感興趣!我簡單的理解是這樣的,作業系統可以沒有圖形顯示,比如各種rtos,linux 等,圖形介面只是在各種系統下的圖形管理應用程式,也就是乙個在應用層的應用程式。應用呼叫核心,核心呼叫驅動,驅動控制真實硬體顯示器。opengl,qt 我認為都是圖形庫,...

作業系統是如何管理GPU等計算資源的?

羅啟盛 為了表示影象,計算機的顯示屏上的每個畫素都一定位元組的資料表示,想想RGB和ARGB這些表示。我們可以試想下 沒有驗證過,有錯請指正 這些資料要顯示到顯示屏上,那麼顯示屏必須有塊記憶體來存放這些資料。顯示屏最簡單的設計就是按照一定頻率把它背後的那塊記憶體的資料解釋並顯示出來。我們的影象,可以...