Почему int обычно 32-битный на 64-битных компиляторах?

Почему int обычно 32-битные на 64-битных компиляторах? Когда я начинал программировать, меня учили, что int обычно имеет ту же ширину, что и базовая архитектура. И я согласен, что это также имеет смысл, я считаю логичным, что целое число неопределенной ширины будет таким же широким, как и базовая платформа (если мы не говорим о 8 или 16-битных машинах, где такой маленький диапазон для int будет едва применимо).

Позже я узнал int обычно 32 бит на большинстве 64 битных платформ. Поэтому мне интересно, что является причиной этого. Для хранения данных я бы предпочел явно указанную ширину типа данных, так что это оставляет общее использование для int, который не дает никаких преимуществ в производительности, по крайней мере, в моей системе у меня одинаковая производительность для 32- и 64-разрядных целых чисел. Так что это оставляет след двоичной памяти, который будет немного уменьшен, хотя и ненамного …

25

Решение

Неудачный выбор со стороны разработчиков?

Серьезно, согласно стандарту, «простые
натуральный размер, предложенный архитектурой исполнения
окружающая среда «, что означает 64-битный int на 64 бит
машина. Можно легко утверждать, что все остальное
не-совместимый. Но на практике вопросы сложнее:
переключение с 32 бит int до 64 бит int было бы не разрешать
большинство программ для обработки больших наборов данных или чего-либо еще (в отличие от
переключиться с 16 бит на 32); большинство программ, вероятно,
ограничены другими соображениями. И это увеличит
размер наборов данных, и, следовательно, уменьшить местность и замедлить
запрограммировать

Наконец (и, вероятно, самое главное), если int были 64 бита,
short должно быть либо 16 бит или
32 бита, и вы не сможете указать другое (кроме
с typedefs в <stdint.h>и намерение состоит в том, что эти
следует использовать только в очень исключительных обстоятельствах).
Я подозреваю, что это было главной мотивацией.

12

Другие решения

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

5

История, компромиссы и решения объясняются The Open Group на http://www.unix.org/whitepapers/64bit.html. Он охватывает различные модели данных, их сильные и слабые стороны, а также изменения, внесенные в спецификации Unix для соответствия 64-битным вычислениям.

5

Потому что многим программам не нужно иметь 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и они не хотели, чтобы это сломалось).

2

Основная причина — обратная совместимость. Более того, уже существует 64-битный целочисленный тип long и то же самое касается типов с плавающей точкой: float а также double, Изменение размеров этих базовых типов для разных архитектур только усложнит задачу. Кроме того, 32-разрядное целое число отвечает многим потребностям в терминах диапазона.

1

Так как никто еще не указал на это.

int гарантированно будет между -С 32767 по 32767 (2^16) Это требуется стандартом. Если вы хотите поддерживать 64-битные числа на всех платформах, я предлагаю использовать правильный тип long long который поддерживает (-9223372036854775807 до 9223372036854775807).

int разрешено быть чем угодно, пока оно обеспечивает минимальный диапазон, требуемый стандартом.

0

Стандарт C ++ не говорит, сколько памяти должно быть использовано для типа int, говорит, сколько памяти нужно использовать, по крайней мере, для типа int. Во многих средах программирования для 32-битных переменных-указателей «int» и «long» имеют длину 32 бита.

0
По вопросам рекламы [email protected]