2012-03-13 5 views
3

sizeof(int) показывает 4 на моем Dev Cpp, хотя его работает на 64-битной машине. Почему он не рассматривает базовые HW и показывает 8 вместо этого? Кроме того, если я компилирую среду, она также изменяется на 64 бит (имеет ли смысл 64 bit compiler?), Изменился бы размер int?Что определяет размер целого числа?

Существуют ли какие-либо стандарты, которые решают это?

ответ

13

Взятые из http://en.wikipedia.org/wiki/64-bit (под 64-bit data models)

Существуют различные модели, Microsoft решила, что sizeof(int) == 4, некоторые (немногие) другие не сделали.

HAL Computer Systems порт Solaris для SPARC64 и Unicos, по-видимому, являются единственными, где sizeof(int) == 8. Они называются ILP64 и SILP64.

Настоящая «война» была для sizeof(long), где Microsoft приняла решение для sizeof(long) == 4 (LLP64), в то время как почти все остальные приняли решение для sizeof(long) == 8 (LP64).

Обратите внимание, что на самом деле это компилятор, который «решает», какую модель использовать, но, как написано в вики

Обратите внимание, что модель программирования является выбор, сделанный на основе каждого компилятора, и несколько может сосуществовать на одной и той же ОС. Тем не менее, модель программирования, выбранная в качестве первичной модели для OS API, обычно доминирует.

+1

И причина, по которой OS API доминирует, заключается в том, что если вы хотите вызвать DLL или аналогичную (включая системные вызовы), то вызывающий и вызываемый должны согласовать размер параметров. Реализация C, которая может выполнять системные вызовы, обычно более полезна, чем тот, который не может, поэтому люди используют ОС ABI, если нет причин для этого. Тот факт, что 64-разрядные версии Windows могут запускать 32-битные исполняемые файлы, благодаря им (среди прочего) обеспечивает 32-битные версии всего, что нужно вызвать программе. –

+0

Выполнение бит 'int' 64 бит и 8 символов означает, что у вас не может быть как 16-битный, так и 32-разрядный предопределенный целочисленный тип (если вы не прибегаете к * расширенным целым типам *, но большинство компиляторов исполнители этого не сделали). –

0

Хотя компилятор в конечном счете решает размер целого числа, он обычно унаследован как размер регистров процессора, который будет содержать целое число. Многие процессоры поддерживают 32-битную/64-разрядную арифметику регистров, а настройки компилятора определяют, какой режим вызывается. Насколько размер (длинный) и т. Д., Единственной гарантией является sizeof (long)> = sizeof (short).

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