Подтвердить что ты не робот

Напишите программу C/С++, чтобы найти, является ли машина 32-разрядной или 64-разрядной

Я искал в Интернете, не мог получить какую-либо программу.
Я нашел следующие ссылки размер машины 64 или 32 бит и обработку файлов на 64-битной машине, но разработка на 32-битной машине.
Теперь ясно, что sizeof (int *) не так. Потому что он вернет 4/8 на основе архитектуры машины, используемой для компиляции. Итак, как его найти?
Условие: не используйте никакой вызов системы /os/library.
На самом деле это вопрос, заданный в интервью.

4b9b3361

Ответ 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 Необходимая информация будет находиться в поле машины.