Долго против 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.

Другие вопросы по тегам