Долго против Int C/C++ - в чем смысл?
Как я недавно узнал, long в C/C++ имеет ту же длину, что и int. Проще говоря, почему? Кажется, что почти бессмысленно даже включать тип данных в язык. Есть ли у него какие-то специфические применения, которых нет у int? Я знаю, что мы можем объявить 64-битное int следующим образом:
long long x = 0;
Но почему язык предпочитает делать это таким образом, а не просто делать длинный колодец... длиннее, чем int? Другие языки, такие как C#, делают это, так почему бы не C/C++?
5 ответов
При написании на C или C++ каждый тип данных зависит от архитектуры и компилятора. В одной системе int равно 32, но вы можете найти те, где это 16 или 64; это не определено, так что дело за компилятором.
Что касается long
а также int
, родом из времен, где стандартное целое число было 16 бит, где long
было 32-битным целым числом - и это действительно было длиннее, чем int
,
Конкретные гарантии заключаются в следующем:
char
не менее 8 бит (1 байт по определению, сколько бы битов не было)short
не менее 16 битint
не менее 16 битlong
не менее 32 битlong long
(в версиях языка, которые его поддерживают) не менее 64 бит- Каждый тип в приведенном выше списке по крайней мере такой же ширины, как и предыдущий тип (но вполне может быть таким же).
Таким образом, имеет смысл использовать long
если вам нужен тип, который не менее 32 бит, int
если вам нужен тип, который достаточно быстрый и не менее 16 бит.
На самом деле, по крайней мере в C, эти нижние границы выражены в терминах диапазонов, а не размеров. Например, язык требует, чтобы INT_MIN <= -32767
, а также INT_MAX >= +32767
, 16-битные требования вытекают из этого и из требования, чтобы целые числа были представлены в двоичном виде.
C99 добавляет <stdint.h>
а также <inttypes.h>
, которые определяют такие типы, как uint32_t
, int_least32_t
, а также int_fast16_t
; это typedef, обычно определяемые как псевдонимы для предопределенных типов.
(Не обязательно существует прямая связь между размером и диапазоном. Реализация может сделать int
32 бита, но с диапазоном только, скажем, -2**23 .. +2^23-1
с другими 8 битами (называемыми битами заполнения), не влияющими на значение. Теоретически возможно (но практически крайне маловероятно), что int
может быть больше, чем long
, пока long
имеет по крайней мере такой же широкий диапазон, как int
, На практике немногие современные системы используют биты заполнения или даже представления, отличные от 2-х, но стандарт все же допускает такие странности. Вы более вероятно столкнетесь с экзотическими функциями во встроенных системах.)
long не такой же длины, как int. Согласно спецификации, long по крайней мере такой же большой, как int. Например, в Linux x86_64 с GCC, sizeof(long) = 8 и sizeof(int) = 4.
long
не такой же размер, как int
, по крайней мере, такой же размер, как int
, Чтобы процитировать стандарт C++03 (3.9.1-2):
Существует четыре типа целых чисел со знаком: "знаковый символ", "короткое целое", "int" и "длинное целое". В этом списке каждый тип обеспечивает как минимум столько же памяти, сколько предшествует ему в списке. Простые целые имеют естественный размер, предложенный архитектурой среды исполнения); другие подписанные целочисленные типы предоставляются для удовлетворения особых потребностей.
Моя интерпретация этого "просто использовать int
, но если по какой-то причине это не соответствует вашим потребностям, и вам повезло найти еще один цельный тип, который лучше подходит, будьте нашим гостем и используйте его вместо этого ". Один из способов long
может быть лучше, если вы находитесь на архитектуре, где она... длиннее.
Искал что-то совершенно не связанное и наткнулся на это и должен был ответить. Да, это старый, так что для людей, которые занимаются серфингом позже...
Честно говоря, я думаю, что все ответы здесь неполные.
Размер long - это количество битов, с которыми ваш процессор может работать за один раз. Это также называется "словом". "Половина" - это сокращение. "Двойное слово" - это длинное длинное и в два раза больше длинного (и первоначально оно было реализовано только продавцами, а не стандартным), и даже больше, чем длинное длинное, - это "четверное слово", которое в два раза больше длинного длинного. но у него не было формального имени (и не совсем стандартного).
Теперь, куда входит int? Частично регистрируется на вашем процессоре, а частично на вашей ОС. Ваши регистры определяют собственные размеры, которые обрабатывает процессор, которые, в свою очередь, определяют размер таких вещей, как короткие и длинные. Процессоры также разработаны с размером данных, который является наиболее эффективным размером для работы с ним. Это должно быть Int.
На сегодняшних 64-битных машинах можно предположить, что поскольку long - это слово, а слово на 64-битной машине - 64-битное, то long будет 64-битным и int независимо от того, для чего предназначен процессор, но это не так. Зачем? Ваша ОС выбрала модель данных и определила эти размеры данных для вас (в значительной степени от того, как она построена). В конечном счете, если вы работаете в Windows (и используете Win64), это 32 бита для long и int. Solaris и Linux используют разные определения (длина - 64 бита). Эти определения называются такими вещами, как ILP64, LP64 и LLP64. Windows использует LLP64, а Solaris и Linux используют LP64:
Модель ILP64 LP64 LLP64 int 64 32 32 длинный 64 64 32 указатель 64 64 64 длинный длинный 64 64 64
Где, например, ILP означает int-long-pointer, а LLP означает long-long-pointer
Чтобы обойти это, большинство компиляторов поддерживают установку целочисленного размера напрямую с типами, такими как int32 или int64.