2010-10-01 213 views
4

有沒有辦法通過在C中編寫代碼來確定機器是32位還是64位?32位或64位?使用C代碼

+3

你知道這[編譯時](http://stackoverflow.com/questions/1505582/determining-32-vs-64-bit-in-c),不是嗎? – GSerg 2010-10-01 23:26:07

+3

什麼?沒有36位機器?或128位?甚至8位? – pmg 2010-10-01 23:31:04

+2

+1 @pmg。我也在一些16位和24位機器上工作。 – 2010-10-01 23:32:20

回答

8
#include <limits.h> 
/* ... */ 
printf("This machine's pointers to void, in a program " 
     "compiled with the same options as this one and " 
     "with the same compiler, use %d bits\n", 
    (int)sizeof (void*) * CHAR_BIT); 
+0

使用'CHAR_BIT'的+1。 – 2010-10-01 23:29:38

+1

完全沒用。編譯用於32位平臺的程序並在64位機器上運行它。它永遠不會知道該機器是64位的。 – AnT 2010-10-01 23:47:46

+0

最重要的是,在典型的16位C平臺上,指針可以很容易地具有32位大小。 – AnT 2010-10-01 23:52:22

7

如果用「C中的某些代碼」表示標準C代碼,那麼答案是否定的,這是不可能的。對於C程序,它可以看到的「世界」完全由實現(由編譯器)創建。編譯器可以絕對模仿與底層硬件無關的任何「世界」。

例如,您可以在64位計算機上運行32位編譯器,並且您將永遠無法從程序中檢測到這是一臺64位計算機的事實。

您可以找到關於機器的任何信息的唯一方法是訪問一些非標準設施,如某些特定於操作系統的API。但是這遠遠超出了C語言的範圍。

不用說,已經在其他回答方法中建議的基於sizeof和其他標準語言工具的方法甚至不能檢測到機器的性能。相反,它們會檢測編譯器實現提供的平臺的性能,通常情況下這是完全不同的事情。

+2

+1正確性;然而,這個「世界」的屬性顯然很重要,因爲它們直接影響到程序的執行,並且可能是zero4正在尋找的東西;我的水晶球並不清晰;) – Christoph 2010-10-01 23:58:53

+0

@Christoph - 我最近把我的水晶球從32位轉換爲64位。餿主意。把我的腳剪下來,在碎片上跳來跳去,最後成百上千的碎片 - 我想這也解釋了爲什麼它仍然無法正常工作。好吧。仍然 - 我期待着「升級」我的電腦,只要我的腳痊癒。 – Steve314 2010-10-02 00:38:49

+0

我認爲第2段是明顯錯誤的。 – 2010-10-02 13:53:56

0

指針大小

sizeof (void *) * CHAR_BIT 

是一個很好的指標,但更奇特的結構可能會被誤導(例如,如果地址總線的大小是沒有字的大小的倍數),僅佔執行環境(這可能與實際硬件不同 - 請參閱AndreyT's answer)。

在預處理階段,你可以將C語言的框架內做的最好的是一樣的東西

UINTPTR_MAX == UINT64_MAX 

與前述相同的限制適用。

0

是,如果在x86處理器上運行使用CPUID指令:

http://en.wikipedia.org/wiki/CPUID

+0

你打算如何從C做到這一點? – 2010-10-02 00:00:36

+1

可能通過將一個指向字符串的指針轉換爲函數指針並嘗試調用它; ;;) – 2010-10-02 19:50:14

+0

「你打算如何從」C「中做到這一點?」:如果使用Visual Studio:「__cpuid(b, a)「 – drivel 2010-10-04 21:30:00

1

有32位或64位環境中沒有這樣的事情,這只是太多過於簡單化的。如果你想編寫一個可移植的應用程序,你可以使用整數,指針和浮點大小的幾個特性。

不同整數類型的大小可以用適當的宏來檢查,如UINT_MAX等,指針大小由UINTPTR_MAX。由於可能有填充位,爲了推導出類型的寬度,您應該打印類似(unsigned long long)(T)-1,其中T是無符號類型。