как определить, является ли машина 32-битной или 64-битной

StackOverflow https://stackoverflow.com/questions/2401756

  •  18-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

#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 правильно настроен, и вывело бы размер вашего регистра в стандартный вывод или вернуло бы код выхода, равный 1 в противном случае.

Смотрите также

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

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

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

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

или

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top