有沒有辦法通過在C中編寫代碼來確定機器是32位還是64位?32位或64位?使用C代碼
回答
#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);
如果用「C中的某些代碼」表示標準C代碼,那麼答案是否定的,這是不可能的。對於C程序,它可以看到的「世界」完全由實現(由編譯器)創建。編譯器可以絕對模仿與底層硬件無關的任何「世界」。
例如,您可以在64位計算機上運行32位編譯器,並且您將永遠無法從程序中檢測到這是一臺64位計算機的事實。
您可以找到關於機器的任何信息的唯一方法是訪問一些非標準設施,如某些特定於操作系統的API。但是這遠遠超出了C語言的範圍。
不用說,已經在其他回答方法中建議的基於sizeof
和其他標準語言工具的方法甚至不能檢測到機器的性能。相反,它們會檢測編譯器實現提供的平臺的性能,通常情況下這是完全不同的事情。
指針大小
sizeof (void *) * CHAR_BIT
是一個很好的指標,但更奇特的結構可能會被誤導(例如,如果地址總線的大小是沒有字的大小的倍數),僅佔執行環境(這可能與實際硬件不同 - 請參閱AndreyT's answer)。
在預處理階段,你可以將C語言的框架內做的最好的是一樣的東西
UINTPTR_MAX == UINT64_MAX
與前述相同的限制適用。
是,如果在x86處理器上運行使用CPUID指令:
你打算如何從C做到這一點? – 2010-10-02 00:00:36
可能通過將一個指向字符串的指針轉換爲函數指針並嘗試調用它; ;;) – 2010-10-02 19:50:14
「你打算如何從」C「中做到這一點?」:如果使用Visual Studio:「__cpuid(b, a)「 – drivel 2010-10-04 21:30:00
有32位或64位環境中沒有這樣的事情,這只是太多過於簡單化的。如果你想編寫一個可移植的應用程序,你可以使用整數,指針和浮點大小的幾個特性。
不同整數類型的大小可以用適當的宏來檢查,如UINT_MAX
等,指針大小由UINTPTR_MAX
。由於可能有填充位,爲了推導出類型的寬度,您應該打印類似(unsigned long long)(T)-1
,其中T
是無符號類型。
- 1. 代碼從32位移植到64位
- 2. 從64位代碼訪問32位DLL
- 3. 運行32位和64位java代碼
- 4. 將32位代碼編譯爲64位
- 5. MySQL 32位或64位 - Apache 32位Windows 64位?
- 6. 如何檢測VC++代碼中的JRE位(32位或64位)
- 7. SharePoint 64位或32位
- 8. Ubuntu 64或32位?
- 9. C# - 在32位和64位
- 10. 32位或64位DLL從.net託管代碼加載
- 11. 在C#中使用32位或64位DLL DllImport
- 12. 32位和64位代碼可以混合使用嗎?
- 13. 遷移C++代碼32位機器到64位機器
- 14. 將C++代碼從32位轉換爲64位
- 15. 在Linux 64位上組合C和彙編(32位代碼)
- 16. 將非託管C++代碼從32位轉換爲64位
- 17. 移植C編寫的32位源代碼到64位
- 18. 如何將32位VBA代碼轉換爲64位VBA代碼
- 19. 32或64位機器
- 20. XOR高32位,低32位,64位數
- 21. Windows上的Perl:32位或64位?
- 22. 我有Numpy 32位或64位嗎?
- 23. 構建gtest的MSVC:32位或64位?
- 24. 在32位或64位matlab上運行?
- 25. 64位或32位版本的WinDBG?
- 26. Visual Studio 2010/2012:32位或64位?
- 27. MySQL ODBC連接器32位或64位?
- 28. System.Data.Sqlite.dll 32勝和64位C#
- 29. 編碼/在32位和64位
- 30. Windows 64位操作系統上的32位或64位Android SDK?
你知道這[編譯時](http://stackoverflow.com/questions/1505582/determining-32-vs-64-bit-in-c),不是嗎? – GSerg 2010-10-01 23:26:07
什麼?沒有36位機器?或128位?甚至8位? – pmg 2010-10-01 23:31:04
+1 @pmg。我也在一些16位和24位機器上工作。 – 2010-10-01 23:32:20