Как найти, является ли машина 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) Используйте некоторый макрос, предоставленный компилятором, который скажет вам одно и то же (если доступно).
Невозможно определить, какая ОС у вас есть с помощью встроенных стандартных функций языка. Они предоставляются компилятором и полностью независимы от ОС.