2017-03-18 57 views
-1

我試圖確定,無論使用預定義的函數還是系統調用,操作系統是32位還是64位。我創建了以下程序。確定OS是32位還是64位而不使用預定義的函數或系統調用?

#include <stdio.h> 
int main() 
{ 
    int i = 1; 
    int c = 0; 
    while(i) 
    { 
     i = i << 1; 
     c++; 
    } 
    printf("%d\n", c); 

    if (c == 32) 
     printf("OS is 32bit\n"); 
    else if (c == 64) 
     printf("OS is 64bit\n"); 
    else printf("wrong answer\n"); 
} 

在32位操作系統提供了corret輸出,但在64位操作系統同時打印「操作系統是32位」。所以,我發現背後的原因,在32位和64位操作系統的數據庫大小爲int 4字節。那麼,有沒有什麼辦法可以在不使用預定義的函數或系統調用的情況下確定操作系統是32位還是64位?

+0

@Ed治癒我知道先生,但有什麼方法可以確定嗎? – rsp

+2

您需要進行一些操作系統調用才能找出有關操作系統的任何信息。對於Windows,[見這裏](http://stackoverflow.com/questions/7011071/detect-32-bit-or-64-bit-of-windows) –

+0

是否可以確定沒有預定義函數或系統調用? – rsp

回答

1
while(i) 
{ 
    i = i << 1; 
    c++; 
} 

超越了符號位左移是未定義行爲(你的循環不會在n位神奇地停止)。

可以包括<stdint.h>和檢查INTPTR_MAX

#include <stdio.h> 
#include <stdint.h> 

#if INTPTR_MAX == INT64_MAX 
    #define ARCH 64 
#elif INTPTR_MAX == INT32_MAX 
    #define ARCH 32 
#else 
    #define ARCH 0 
#endif 

int main(void) 
{ 
    printf("OS is %dbit\n", ARCH); 
    return 0; 
} 

或者你可以可以編譯爲傳遞國旗的具體目標:

gcc -DARCH=32 -o demo demo.c 

/D如果你的Visual Studio下。

+1

在64位操作系統上運行的32位編譯程序如何? –

+0

該技術告訴您有關編譯器實現和目標,而不是操作系統。大多數現代GPOS支持在64位平臺上執行32位代碼。 – Clifford

+0

@EdHeal我的意思是你可以建立兩個版本的程序。 –

2

不幸的是,答案是「否」。 您的代碼所做的是確定在使用C編譯器時定義的int變量的大小。 C中的32位整數與操作本身是32位還是64位無關。 (我的操作系統是64位,但運行你的代碼的狀態不正確,「操作系統是32位」)。爲了確定操作系統字大小,你需要訪問操作系統定義,並且需要系統調用。