как определить, является ли машина 32-битной или 64-битной
-
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/