Как найти, является ли машина 32-битной или 64-битной

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

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

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

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

Ответы

Ответ 1

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

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

Что вы действительно хотите знать?

Ответ 2

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

#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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

или

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

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