2017-03-18 3 views
-1

Ich versuche festzustellen, ob das Betriebssystem 32bit oder 64bit ohne vordefinierte Funktionen oder Systemaufruf ist. Ich habe folgendes Programm erstellt.Bestimmen Sie, ob das Betriebssystem 32bit oder 64bit ist, ohne vordefinierte Funktionen oder Systemaufrufe zu verwenden?

#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"); 
} 

In 32bit os gibt corret Ausgang, aber in 64-Bit-Betriebssystem auch "O ist 32bit" drucken. Also, ich fand den Grund dafür, in 32bit und 64bit OS natally Größe von int 4bytes. Also, Gibt es eine Möglichkeit festzustellen, ob das Betriebssystem 32bit oder 64bit ohne vordefinierte Funktionen oder Systemaufrufe ist?

+0

@Ed Heal ich weiß, Herr, aber gibt es eine Möglichkeit zu bestimmen? – rsp

+2

Sie müssen einen Betriebssystemanruf tätigen, um etwas über das Betriebssystem herauszufinden. Für Windows, [siehe hier] (http://stackoverflow.com/questions/7011071/detect-32-bit-or-64-bit-of-windows) –

+0

Ist es möglich, ohne vordefinierte Funktion oder Systemaufruf zu bestimmen? – rsp

Antwort

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

Linksverschiebung über das Vorzeichenbit hat Verhalten nicht definiert (die Schleife nicht auf magische Weise auf n Bits stoppt).

Sie können <stdint.h> und Check 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; 
} 

Oder Sie können für ein bestimmtes Ziel kompilieren ein Flag vorbei:

gcc -DARCH=32 -o demo demo.c 

/D, wenn Sie unter Visual Studio sind.

+1

Was ist mit einem Programm, das für 32bit kompiliert wurde und auf einem 64bit Betriebssystem läuft? –

+0

Diese Technik informiert Sie über die Implementierung und das Ziel des Compilers, nicht das Betriebssystem. Die meisten modernen GPOS unterstützen die Ausführung von 32-Bit-Code auf einer 64-Bit-Plattform. – Clifford

+0

@EdHeal Ich meine, Sie können zwei Versionen des Programms erstellen. –

2

Leider ist die Antwort "Nein". Der Code bestimmt, welche Größe eine int-Variable definiert, wenn der C-Compiler verwendet wird. Eine 32-Bit-Ganzzahl in C hat nichts damit zu tun, ob die Operation selbst 32 Bit oder 64 Bit ist. (Mein Betriebssystem ist 64 Bit, aber die Code-Status werden falsch ausgeführt "OS ist 32 Bit".) Um die Betriebssystem-Wortgröße zu bestimmen, benötigen Sie Zugriff auf die Betriebssystemdefinitionen und das erfordert einen Systemaufruf.

Verwandte Themen