Почему int
обычно 32-битные на 64-битных компиляторах? Когда я начинал программировать, меня учили, что int обычно имеет ту же ширину, что и базовая архитектура. И я согласен, что это также имеет смысл, я считаю логичным, что целое число неопределенной ширины будет таким же широким, как и базовая платформа (если мы не говорим о 8 или 16-битных машинах, где такой маленький диапазон для int
будет едва применимо).
Позже я узнал int
обычно 32 бит на большинстве 64 битных платформ. Поэтому мне интересно, что является причиной этого. Для хранения данных я бы предпочел явно указанную ширину типа данных, так что это оставляет общее использование для int
, который не дает никаких преимуществ в производительности, по крайней мере, в моей системе у меня одинаковая производительность для 32- и 64-разрядных целых чисел. Так что это оставляет след двоичной памяти, который будет немного уменьшен, хотя и ненамного …
Неудачный выбор со стороны разработчиков?
Серьезно, согласно стандарту, «простые
натуральный размер, предложенный архитектурой исполнения
окружающая среда «, что означает 64-битный int
на 64 бит
машина. Можно легко утверждать, что все остальное
не-совместимый. Но на практике вопросы сложнее:
переключение с 32 бит int
до 64 бит int
было бы не разрешать
большинство программ для обработки больших наборов данных или чего-либо еще (в отличие от
переключиться с 16 бит на 32); большинство программ, вероятно,
ограничены другими соображениями. И это увеличит
размер наборов данных, и, следовательно, уменьшить местность и замедлить
запрограммировать
Наконец (и, вероятно, самое главное), если int
были 64 бита,
short
должно быть либо 16 бит или
32 бита, и вы не сможете указать другое (кроме
с typedefs в <stdint.h>
и намерение состоит в том, что эти
следует использовать только в очень исключительных обстоятельствах).
Я подозреваю, что это было главной мотивацией.
int
На большинстве основных архитектур 32-битные версии были так долго, что изменение их на 64-битные, вероятно, вызовет больше проблем, чем решит.
История, компромиссы и решения объясняются The Open Group на http://www.unix.org/whitepapers/64bit.html. Он охватывает различные модели данных, их сильные и слабые стороны, а также изменения, внесенные в спецификации Unix для соответствия 64-битным вычислениям.
Потому что многим программам не нужно иметь 64-битные целые числа.
Использование 64-битных целых чисел для вычисления вещей, которые можно вычислить в 32-битном целом (и для многих целей достаточно значений до 4 миллиардов (или +/- 2 биллона)), и их увеличение ничего не поможет.
Однако использование большего целого числа отрицательно скажется на том, сколько «размеров» целых чисел помещается в кэш на процессоре. Таким образом, увеличение их размера приведет к тому, что вычисления, включающие большое количество целых чисел (например, массивов), потребуют больше времени, поскольку
int
Это естественный размер машинного слова, который не предусмотрен стандартом C ++. В те дни, когда большинство машин работали с 16 или 32 битами, имело смысл использовать 16 или 32 бит, потому что это очень эффективный размер для этих машин. Когда дело доходит до 64-битных машин, это больше не «помогает». Так что оставаясь с 32 бит int
имеет больше смысла.
Редактировать:
Интересно, что когда Microsoft перешла на 64-разрядную версию, они даже не сделали long
64-битный, потому что он сломал бы слишком много вещей, на которые полагался long
будучи 32-битным значением (или, что более важно, у них было множество вещей, которые полагались на long
будучи 32-битным значением в их API, где иногда клиентское программное обеспечение использует int
и иногда long
и они не хотели, чтобы это сломалось).
Основная причина — обратная совместимость. Более того, уже существует 64-битный целочисленный тип long
и то же самое касается типов с плавающей точкой: float
а также double
, Изменение размеров этих базовых типов для разных архитектур только усложнит задачу. Кроме того, 32-разрядное целое число отвечает многим потребностям в терминах диапазона.
Так как никто еще не указал на это.
int
гарантированно будет между -С 32767 по 32767 (2^16
) Это требуется стандартом. Если вы хотите поддерживать 64-битные числа на всех платформах, я предлагаю использовать правильный тип long long
который поддерживает (-9223372036854775807 до 9223372036854775807).
int
разрешено быть чем угодно, пока оно обеспечивает минимальный диапазон, требуемый стандартом.
Стандарт C ++ не говорит, сколько памяти должно быть использовано для типа int, говорит, сколько памяти нужно использовать, по крайней мере, для типа int. Во многих средах программирования для 32-битных переменных-указателей «int» и «long» имеют длину 32 бита.