2014-11-16 2 views
-2

Это может быть очень глупый вопрос:Написать 64-разрядную программу в C

  • Как я пишу программу, особенно для 64-битной архитектуры.

Мы работаем над системой Solaris.

Есть ли разница в самом коде для 32-разрядных и 64-разрядных? Или это скорее вопрос заголовков?

Может ли кто-нибудь дать мне простой пример имени приветствия для 64-битного?

+0

Какую программу вы пишете? –

+0

ключевым отличием является размер (в байтах) (и, следовательно, максимальные значения) для числовых переменных. – user3629249

ответ

5

Вот 64-разрядная программа:

#include <stdio.h> 

int main(void) 
{ 
    puts("Hello world!"); 
    return 0; 
} 

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

Вот альтернативная программа:

#include <limits.h> 
#include <stdio.h> 

int main(void) 
{ 
    printf("%ld\n", LONG_MAX); 
    return 0; 
} 

Это будет производить различные ответы на 32-битные системы и 64-разрядные системы Unix, но 16-битные системы и 64-битные системы Windows, будут производить то же самое как 32-битные системы.

Обратите внимание, что обе эти программы имеют одинаковый исходный код и используют одни и те же заголовки независимо от того, скомпилированы ли они для 32-разрядных или 64-разрядных (или 16-разрядных или 8-разрядных на Grzegorz Szpetkowskicomment). Одна из программ имеет различное поведение в зависимости от платформы (компилятора) и скомпилирована ли она для 32-битного или 64-битного режима; другой производит независимо тот же результат. Очевидно, что значение LONG_MAX, полученное из заголовка, может быть различным в зависимости от режима компиляции.

+0

ty ребята, отметьте как правильно как можно скорее –

2

Это специальный компилятор.

Если вы используете недавний GCC (на Sparc или x86), я предполагаю, что вы используете

gcc -m32 -Wall -g hello.c -o hello-32 

и

gcc -m64 -Wall -g hello.c -o hello-64 

компилировать hello.c в 32 бита исполняемого hello-32 (соответственно . 64-разрядный исполняемый файл hello-64)

Вы можете добавить другие параметры, например -mtune=native -O2

Как Jonathan Leffler wisely answered, эта же программа может быть скомпилирована для 32 бит или для 64-битной системы. Вы должны следить за тем, чтобы поведение было разумным.

Возможно, вы захотите использовать заголовок 44999296595301604334597928888 C99. С недавним компилятором (GCC 4.9 или выше) вы можете запрограммировать код C11 с использованием -std=c11 компилятора.

Избегайте указаний на литье или их интегральных типов. Если вы абсолютно необходимо, что использовать intptr_t и т.д ...

+0

ty тоже basile, попробуй –

1

В C вам просто нужен 64-битный компилятор и 64-битная платформа для запуска кода.

По большей части разница между вашим фактическим исходным кодом будет незначительной, но есть некоторые различия в платформе, о которых нужно знать. Различные ОС используют разные 64 bit data models; например, в Win64 a long остается 32 бит, а Solaris long - 64 бит. Если у вас есть код, который полагается на длинное 32-битное, вам нужно будет изменить этот код - в таких случаях всегда было бы безопаснее использовать int32_t или uint32_t в любом случае.

Solaris на SPARC64 все типы данных, отличные от short и char, становятся 64-разрядными, что может потребовать некоторого ухода за существующим кодом.

64 bit data models

+0

есть ли там int64_t? или, скажем, short32_t? –

+0

@DatLuckey: заголовок '' определяет типы фиксированных размеров, такие как 'int8_t',' uint16_t', 'int32_t',' uint64_t' (всегда как подписанные, так и неподписанные, если они доступны) и некоторые нефиксированные размеры, такие как 'intmax_t' и' uintptr_t'. В любой системе, о которой я когда-либо слышал, нет 'short32_t'. –

+0

Нет 'short32_t' - 32 бита - это явная длина - термин short в имени будет лишним. Речь идет не о задании или переопределении длины 'int' или' short' - вы не можете изменить это; а скорее о задании * целочисленного * представления определенной длины бит. Имена - это просто псевдонимы типов для * встроенных * типов данных. Так, например, в LLP64 'int32_t' может быть псевдоним для' int' или 'long', поскольку они оба 32 бит, тогда как на LP64 это псевдоним только для' int'. Подробнее о типах, определенных в 'stdint.h', см. Http://www.cplusplus.com/reference/cstdint/. – Clifford

Смежные вопросы