Каков исторический контекст для long и int часто одного размера? - PullRequest
5 голосов
/ 17 июня 2011

Согласно многочисленным ответам здесь, long и int имеют размер 32 бита на общих платформах в C и C ++ (Windows & Linux, 32 и 64 бит.) (ЯЯ знаю, что не существует стандарта, но на практике это наблюдаемые размеры.)

Итак, мой вопрос: как это произошло?Почему у нас есть два типа, которые имеют одинаковый размер?Ранее я всегда предполагал, что long в большинстве случаев будет 64 битами, а int 32. Я не говорю, что это "должно" быть так или иначе, мне просто любопытно, как мы сюда попали.

Ответы [ 5 ]

5 голосов
/ 18 июня 2011

Из обоснования C99 (PDF) в разделе 6.2.5:

[...] В 1970-х годах 16-битный C (для PDP-11) первый представленный файл информация с 16-битными целыми числами, которые быстро устарели на диске прогресс. Люди перешли на 32-битный файловая система, сначала используя int[2] конструкции, которые были не только неловко, но не эффективно перенос на 32-битное оборудование.

Для решения проблемы введите long был добавлен к языку, хотя это требовало C на PDP-11 для генерировать несколько операций для симулировать 32-битную арифметику. Даже как 32-битные миникомпьютеры стали доступны наряду с 16-битными системами, люди все еще используется int для эффективности, резервирование long для случаев, когда большие целые числа были действительно необходимы, так как long был заметно менее эффективен на 16-битной системы. И short, и long были добавлено в C, что делает short доступным для 16 бит, long для 32 бит и int как удобно для исполнения. Не было никакого желания заблокировать числа 16 или 32 в язык, как существовали компиляторы Си по крайней мере 24- и 36-битные процессоры, а точнее предоставить имена, которые могут быть использованы для 32 бита по мере необходимости.

PDP-11 C мог быть повторно реализован с int как 32-бит, таким образом избегая необходимости для long; но это заставило бы людей измениться большинство применений от int до short или страдать от серьезного снижения производительности на PDP-11. В добавок к потенциальное влияние на исходный код, влияние на существующий объектный код и файлы данных были бы хуже, даже в 1976 году, с огромным установлена ​​база программного обеспечения, а также Широкое использование динамически связанных библиотеки, влияние изменения размер общего объекта данных в существующая среда настолько высока, что мало кто будет терпеть это, хотя это может быть приемлемо при создании новая среда. Следовательно, многие продавцы, чтобы избежать конфликтов пространства имен, есть добавил 64-битное целое число к своему 32-битному C средах, использующих новое имя, из который long long был самым широко используемый. [...]

5 голосов
/ 17 июня 2011

Исторически сложилось, что большинство размеров и типов в C можно проследить до архитектуры PDP-11. Это были байты, слова (16 бит) и двойные слова (32 бита). Когда C и UNIX были перенесены на другую машину (я думаю, Interdata 832), длина слова была 32 бита. Чтобы обеспечить совместимость источника, были определены long и int так, чтобы строго

sizeof(short) & le; sizeof(int) & le; sizeof(long).

Большинство машин теперь заканчивают на sizeof(int) = sizeof(long), потому что 16 бит больше не удобны, но мы долго не могли получить 64 бита, если это необходимо.

Обновление Строго говоря, я должен был сказать "компиляторы", потому что разные исполнители компилятора могут принимать разные решения для одной и той же архитектуры набора команд. GCC и Microsoft, например.

3 голосов
/ 17 июня 2011

В конце 70-х и начале 80-х многие архитектуры были 16-битными, поэтому обычно char был 8-битным, int был 16-битным, а long - 32-битным.В конце 80-х произошел общий переход к 32-битным архитектурам, поэтому int стал 32-битным, но долго оставался 32-битным.

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

Итог: не делайте никаких предположений относительно размеровразные целочисленные типы (кроме того, что определено в стандарте, конечно), и если вам нужны типы фиксированного размера, тогда используйте <stdint.h>.

0 голосов
/ 17 июня 2011

В 16-разрядных операционных системах int был 16-разрядным, а long - 32-разрядным. После перехода на Win32 оба становятся 32-битными. Переход на 64-битную ОС, это хорошая идея, чтобы сохранить большой размер без изменений, это не нарушает существующий код при компиляции в 64-битной. Новые типы (такие как Microsoft __int64, size_t и т. Д.) Могут использоваться в 64-битных программах.

0 голосов
/ 17 июня 2011

Насколько я понимаю, стандарт C требует, чтобы длина long была не менее 32 бит, а длина не менее int.int, с другой стороны, всегда (я думаю) равен собственному размеру слова архитектуры.

Имейте в виду, что при разработке стандартов 32-битные машины не былиобщий;Первоначально int, вероятно, был бы родным 16-разрядным, а long был бы вдвое длиннее при 32-разрядном.

...