Долго противInt C / C ++ - в чем смысл? - PullRequest
28 голосов
/ 17 сентября 2011

Как я недавно узнал, long в C / C ++ имеет ту же длину, что и int.Проще говоря, почему?Кажется почти бессмысленным даже включать тип данных в язык.Есть ли у него какие-то специфические применения, которых нет у int?Я знаю, что мы можем объявить 64-битное целое число следующим образом:

long long x = 0;

Но почему язык предпочитает делать это таким образом, а не просто делать длинный лунку ... длиннее, чем int?Другие языки, такие как C #, делают это, так почему бы не C / C ++?

Ответы [ 5 ]

30 голосов
/ 17 сентября 2011

При написании на C или C ++ каждый тип данных зависит от архитектуры и компилятора.В одной системе int равно 32, но вы можете найти те, где это 16 или 64;он не определен, так что это зависит от компилятора.

Что касается long и int, это происходит из-за того, что стандартное целое число было 16 бит, где long было 32-битное целое - и это действительно было длиннее int.

29 голосов
/ 18 сентября 2011

Конкретные гарантии заключаются в следующем:

  • 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; это typedefs, обычно определяемые как псевдонимы для предопределенных типов.

(* не обязательно - прямая связь между размером и диапазоном. Реализация может составить int 32 бита, но с диапазоном, скажем, -2**23 .. +2^23-1, с другими 8 биты (называемые битами заполнения ), не способствующие значению. Теоретически возможно (но практически маловероятно), что int может быть больше, чем long, если long имеет по крайней мере такую ​​же ширину диапазон как int. На практике лишь немногие современные системы используют биты заполнения или даже представления, отличные от 2-х, но стандарт все еще допускает такие странности. С большей вероятностью вы столкнетесь с экзотическими функциями в встроенные системы.)

18 голосов
/ 17 сентября 2011

длина не совпадает с длиной Int.Согласно спецификации, long по крайней мере такой же большой, как int.Например, в Linux x86_64 с GCC, sizeof (long) = 8 и sizeof (int) = 4.

13 голосов
/ 17 сентября 2011

long - это не тот же размер, что и int, это , по крайней мере, такой же размер, как и int. Чтобы процитировать стандарт C ++ 03 (3.9.1-2):

Существует четыре типа целых чисел со знаком: «знаковый символ», «короткое целое», «Int» и «long int». В этом списке каждый тип предоставляет как минимум много памяти, как те, которые предшествуют этому в списке. Простые интты имеют натуральный размер, предложенный архитектурой исполнения среда); другие типы целых чисел со знаком предоставляются для удовлетворения особых потребностей.

* * 1010

Моя интерпретация этого слова такова: «просто используйте int, но если по какой-то причине это не соответствует вашим потребностям, и вам повезло найти другой более подходящий тип, будьте нашим гостем и используйте его вместо этого». long может быть лучше, если вы работаете с архитектурой, в которой она ... длиннее.

1 голос
/ 27 мая 2016

искал что-то совершенно не связанное и наткнулся на это и должен был ответить.Да, это старо, поэтому для людей, которые занимаются серфингом позже ...

Честно говоря, я думаю, что все ответы здесь неполные.

Размер 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:

Model      ILP64   LP64   LLP64
int        64      32     32
long       64      64     32
pointer    64      64     64
long long  64      64     64

Где, например, ILP означает int-long-pointer, а LLP означает long-long-pointer

Чтобы обойти это наиболееКомпиляторы, кажется, поддерживают установку размера целого числа напрямую с типами, такими как int32 или int64.

...