64-битный или 32-битный код C на Solaris 10 - PullRequest
3 голосов
/ 09 октября 2010

В моей системе Solaris 10 update 9 выдает следующую команду:

#isainfo -b
64 

Но если я создаю следующую программу на C с включенным limit.h, я получаю:

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

int main(void)
{ 
     printf("Maximum integer value on this system is = %d\n", INT_MAX);
}
gcc on64.c -o on64
./on64

Maximum integer value on this system is = 2147483647

Я ожидал гораздо большего результата, потому что система работает на 64 битах. Это похоже на 32-битный результат. Это проблема с компилятором?

Ответы [ 7 ]

9 голосов
/ 09 октября 2010

Существует множество моделей программирования для 64-битных платформ, http://www.unix.org/version2/whatsnew/lp64_wp.html,, в том числе:

  • ILP64 (где int, long и указатели являются 64-битными)
  • LP64 (где int 32-битный, а long и указатели 64-битные)

64-битный Solaris 10 использует модель LP64 (http://www.sun.com/software/solaris/faqs/64bit.xml#q4):

В: Какая модель данных используется для Операционная система Solaris?

A: LP64 - отрасль де-факто стандарт. L представляет собой длинный и P представляет указатель. Оба 64-битный, тогда как int 32-битный.

В дополнение к «64-битным моделям программирования: почему LP64?» В статье, на которую ссылаются выше, вы можете посмотреть объяснение Рэймонда Чена, почему Win64 выбрал модель LLP64, поскольку это может помочь в обосновании различных аргументов и аргументов в документе unix.org: http://blogs.msdn.com/b/oldnewthing/archive/2005/01/31/363790.aspx

5 голосов
/ 09 октября 2010

Тип "int" является 32-битным на gcc независимо от платформы.Тип long - 32 бита на 32-битных платформах и 64 бита на 64-битных платформах.

Чтобы быть менее двусмысленным, вы можете использовать типы C99:

#include <stdint.h>

int32_t i32;
int64_t i64;
1 голос
/ 09 октября 2010

Вы можете компилировать программы на Solaris 10 для 32-битных или 64-битных. По умолчанию они компилируются 32-битными.

Используя как GCC, так и более поздние компиляторы Sun, опции '-m32' и '-m64' определяют, какая опция используется. Следовательно, попробуйте:

$ gcc -m64 -o on64-64 on64.c
$ gcc -m32 -o on64-32 on64.c

Затем запустите:

$ file on64 on64-32 on64-64
...take a look see...
$ ./on64-64
...take a look see...
$ ./on64-32
...as you originally found...
$
1 голос
/ 09 октября 2010

Если вам нужен размер наибольшего целочисленного типа, это intmax_t:

#include <stdio.h>
#include <stdint.h>

int main(void)
{ 
     printf("Maximum integer value on this system is = %jd\n", INTMAX_MAX);
}

Это всегда будет не менее 2 ^ 63 - 1.

1 голос
/ 09 октября 2010

Из документации gcc :

В 64-битной среде для int устанавливается значение 32 биты и длинные и указатель на 64 бита и генерирует код для AMD x86-64 архитектура.

0 голосов
/ 19 мая 2012

Если вы хотите увидеть тип long (то есть 32-битный в 32-битной архитектуре и 64-битный в 64-битной архитектуре, в отличие от «int», который всегда 32-битный), вы могли бы напечатать:

printf("max long = %ld", LONG_MAX);

, что дает мне это при компиляции с '-m64'

Max long on this system is: 9223372036854775807

и это при компиляции с '-m32'

Max long on this system is: 2147483647
0 голосов
/ 11 октября 2010

Во-первых, вы должны убедиться, что ваш компилятор работает в 64-битном режиме.Некоторые компиляторы по умолчанию используют 32-битный режим целевой платформы, даже если они способны генерировать 64-битный код.

Во-вторых, некоторые компиляторы предпочитают модель 64-битного типа, где тип int остается 32-битным.GCC на самом деле является одним из них.Итак, ваши ожидания того, что тип int станет 64-битным типом в 64-битном режиме, абсолютно необоснованны.

Опять же, все зависит от компилятора и только от компилятора (и от настроек компилятора).То, что вы сделали с вашей ОС, совершенно не имеет значения.Вы можете обновить свой Solaris до 237-битной или 1001-битной версии, но GCC будет продолжать генерировать 32-битный код, пока не будет изменено значение по умолчанию GCC или пока вы явно не запросите другую целевую платформу.

...