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

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

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

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

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

17
задан N 1.1 8 March 2010 в 18:46
поделиться

6 ответов

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

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

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

8
ответ дан 30 November 2019 в 13:40
поделиться

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

3
ответ дан 30 November 2019 в 13:40
поделиться

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

2
ответ дан 30 November 2019 в 13:40
поделиться

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

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

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

1
ответ дан 30 November 2019 в 13:40
поделиться

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

#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 в противном случае.

См. также

6
ответ дан 30 November 2019 в 13:40
поделиться

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

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

или

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

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

1
ответ дан 30 November 2019 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: