Я искал в Интернете, не мог получить какую-либо программу.
Я нашел следующие ссылки размер машины 64 или 32 бит и обработку файлов на 64-битной машине, но разработка на 32-битной машине.
Теперь ясно, что sizeof (int *) не так. Потому что он вернет 4/8 на основе архитектуры машины, используемой для компиляции. Итак, как его найти?
Условие: не используйте никакой вызов системы /os/library.
На самом деле это вопрос, заданный в интервью.
Напишите программу C/С++, чтобы найти, является ли машина 32-разрядной или 64-разрядной
Ответ 1
32-битные системные адресные пространства не могут адресовать более 4 ГБ памяти. Если предположить, что 64-битную платформу есть, что сумма, доступная бесплатно (спорно), вы могли бы попытаться выделить более 4 гига в одном куске. Это, безусловно, потерпит неудачу в 32-разрядной системе.
Это просто мысль, и я, вероятно, прогоню до ада и обратно, но это всего лишь предложение:)
Ответ 2
Скомпилируйте программу как 64 бит и попробуйте, если она может быть выполнена на целевой машине или нет?
Ответ 3
Как насчет встроенной сборки?:)
Это основано исключительно на информации, считываемой с инструкцией CPUID. Неважно, какая ОС используется.
#include <iostream>
bool is64Bit()
{
int ExtendedFeatureFlags;
asm ( "mov $0x80000001, %%eax; " // 0x80000001 gets Extended Feature Flags
"cpuid; " // Call CPUID instruction.
"mov %%edx, %0; " // Copy EDX into first output variable.
:"=r"(ExtendedFeatureFlags) // Output variable.
: // No input variables.
:"%eax","%ebx","%ecx","%edx" // Clobbered registers.
);
return ExtendedFeatureFlags & (1<<29);
// If the 29th bit is on, the processor supports 64bit
// extensions.
}
int main()
{
std::cout << "Is 64bit?: " << (is64Bit() ? "YES" : "NO") << std::endl;
return 0;
}
Ответ 4
Я буду очень впечатлен, если вам удастся найти какой-либо способ aisde from sizeof (int *), который не использует вызов операционной системы. Я думаю, что у вас, вероятно, уже есть хороший ответ, который они искали: p
Ответ 5
С С++ int на 64-битной машине с 64-битным компилятором должен быть 64 бита, аналогично для 32-битной машины, поэтому sizeof (int *) должен работать
Ответ 6
Как создать программу, которая сама создает файл simple.cpp и пытается скомпилировать ее в обоих направлениях?:)
Ответ 7
32-разрядная среда устанавливает int, long и указатель на 32 бита и генерирует код, который запускается в любой системе i386.
64-разрядная среда устанавливает int до 32 бит и длиной и указатель на 64 бита и генерирует код для архитектуры AMD x86-64.
Вы можете использовать
#include <stdio.h>
int main(){
long z; printf("Long int size is %i bytes long!\n", sizeof(z)); return 0;
}
и скомпилировать с -m32 и -m64 в gcc. Если на его 64-битной платформе программа запустится, а выход будет 8, программа будет умирать.
Ответ 8
#include <stdio.h>
int main(void) {
printf("\n The Processor in this machine is %lu Bit Machine", sizeof(void *));
return 0;
}
Ответ 9
Как насчет использования системного вызова uname в системах жалобы POSIX: http://linux.die.net/man/2/uname Необходимая информация будет находиться в поле машины.