2010-10-09 2 views
3

На моих Solaris 10 обновлений 9 системы следующих выходов команд:64 бит против 32 битного кода C на Solaris 10

#isainfo -b 
64 

Но если я создаю следующую программу в C с limits.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-битный результат. Это проблема компилятора?

ответ

1

Из gcc documentation:

64-разрядные наборы среды Int 32 бит и длиной и указателем на 64 бита и генерирует код для x86-64 архитектуры AMD.

5

Тип «int» 32-бит на gcc независимо от платформы. «Длинный» тип - 32 бита на 32-битных платформах и 64 бита на 64-битных платформах.

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

#include <stdint.h> 

int32_t i32; 
int64_t i64; 
1

Если вы хотите, чтобы размер самого большого интегрального типа, это 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.

+0

Это фактически отобразит -1. Если вам нужен правильный дисплей, используйте% lld вместо% d в формате инструкции printf. – jlliagre

+0

Спасибо, @jlliagre. –

+0

Добро пожаловать,% jd менее известен, но действительно даже лучше. – jlliagre

9

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

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

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

Q: Что такая модель данных, используемая для операционной системы Solaris?

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

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

+0

+1 для интересных ссылок. (Для записи, хотя я понимаю, что делали Windows с LLP64, я думаю, что LP64 - более здравая модель. Просто неудачно, что кодовая база Win «galaxy» не соответствовала этому переходу, слишком много плохих практик создалось.) –

+0

+1 для LP64 по сравнению с ILP64 –

1

Вы можете скомпилировать программы на 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... 
$ 
+0

«int» - это 32-разрядный тип для 32-разрядных и 64-разрядных архитектур. Только «длинные» были бы разными. –

0

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

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

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

0

Если вы хотите увидеть «длинный» тип (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 
Смежные вопросы