как узнать, машина 32-битная или 64-битная - PullRequest
16 голосов
/ 08 марта 2010

Есть ли в любом случае прога C, чтобы узнать, работает ли ОС в настоящее время в 32-битном или 64-битном режиме. Я использую простую программу, как показано ниже

int main(void){
     switch(sizeof(void*)){
        case 4: printf("32\n");
        break;
        case 8: printf("64\n");
        break;
    }
}

Это правильный подход? Будет ли этот код работать во всех сценариях, например, если аппаратное обеспечение 64-битное, а ОС 32-битное, что вернет? У меня нет машины, чтобы проверить это в различных конфигурациях.

Спасибо за совет.

Ответы [ 6 ]

8 голосов
/ 08 марта 2010
  • В общем случае 32-битный исполняемый файл не сможет определить, работает ли он под 64-битной ОС или 32-битной (некоторые ОС могут иметь способ узнать, я не знаю ни одного, кроме меня). не искали), 64-битный исполняемый файл не будет работать под 32-битной ОС (если вы не учитываете возможность для 32-битной ОС эмулировать процессор с 64-битной ОС ...)

  • sizeof () результат в основном является константой времени компиляции, он не будет возвращать что-то другое в зависимости от версии ОС, под которой он работает.

Что ты хочешь знать на самом деле?

6 голосов
/ 08 марта 2010

Чтобы ответить на ваш вопрос строго как дано:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
    long wordBits = sysconf(_SC_WORD_BIT);
    if (wordBits == -1 && errno == EINVAL)
        return EXIT_FAILURE;
    else
        printf("%ld\n", wordBits);
    return EXIT_SUCCESS;
}

Это будет работать в любой ситуации, когда glibc настроен правильно, и вывести размер регистра в stdout или вернуть код выхода, равный 1.

См. Также

3 голосов
/ 08 марта 2010

В дополнение к методам времени компиляции и если вы работаете в Windows: вызов IsWow64Process (http://msdn.microsoft.com/en-us/library/ms684139.aspx) вернет true, если процесс 32-битный, запущенный под 64-битная Windows.

2 голосов
/ 08 марта 2010

В Windows вы можете посмотреть переменную среды PROCESSOR_ARCHITECTURE. Он вернет либо «x86», когда программа работает в 32-битном режиме (либо потому, что она работает под 32-битной ОС, либо потому, что она работает на 64-битной ОС, но как 32-битная программа под WOW64), либо либо «IA64 "или" AMD64 ", если выполняется как собственная 64-разрядная программа в 64-разрядной ОС.

1 голос
/ 08 марта 2010

Единственный способ ответить на этот вопрос:

(1) Используйте некоторые специфические для системы функции (вызов API, переменные среды и т. Д.), Которые сообщают вам, является ли ОС 32- или 64-разрядной.

или

(2) Используйте предоставленный компилятором макрос, который сообщит вам то же самое (если доступно).

Нет способа определить, какая у вас ОС, с помощью любых встроенных стандартных языковых функций. Они предоставляются компилятором и полностью независимы от ОС.

1 голос
/ 08 марта 2010

Я думаю, что ваше решение, вероятно, действительно в большинстве случаев; безусловно, во всех стандартных моделях данных IA64 указатели являются 64-битными. Это, однако, может не относиться ко всем архитектурам в теории. Может быть безопаснее проверить sizeof(uintptr_t), если компилятор имеет заголовок C99; но опять же предполагается, что ширина адреса указывает на ширину регистра; это зависит от того, под "64-битным" вы ссылаетесь на диапазон адресов или диапазон целых чисел - они не обязательно должны совпадать.

Поскольку для 32-битной и 64-битной компиляции требуется либо другой компилятор, либо другой переключатель компилятора, целевая архитектура должна быть известна во время сборки и не должна определяться во время выполнения.

Большинство компиляторов предоставляют макросы со встроенной архитектурой, которые позволяют определять это во время сборки. Полный список таких макросов для различных компиляторов, ОС и архитектур определен по адресу: http://predef.sourceforge.net/

...