Длинные Vs. Int C/С++ - Что такое точка?

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

long long x = 0;

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

Ответы

Ответ 1

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

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

Ответ 2

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

  • char - не менее 8 бит (по одному байту по определению, однако, сколько битов оно)
  • 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'-дополнения, но стандарт все еще допускает такие странности. Вероятнее всего, вы столкнетесь с экзотическими функциями во встроенных системах.)

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

Размер длинного - это размер количества бит, на который процессор может работать в одно время. Он также называется "словом". "Полу-слово" является коротким. "Двойное слово" длинное и вдвое больше, чем длинное (и первоначально оно было реализовано только поставщиками, а не стандартным), и даже больше, чем длинный, это "квадрат", который в два раза длиннее длинного но у него не было формального имени (и не совсем стандартного).

Теперь, где входит int? В части регистров на вашем процессоре, а частично в вашей ОС. Ваши регистры определяют собственные размеры процессоров, которые, в свою очередь, определяют размер таких вещей, как короткие и длинные. Процессоры также разработаны с размером данных, который является наиболее эффективным для его работы. Это должно быть int.

На сегодняшних 64-битных машинах, которые вы предположили бы, поскольку длинное слово и слово на 64-битной машине - 64 бита, то длинный будет 64 бита и int, какой процессор предназначен для обработки, но это может быть не так, Зачем? Ваша ОС выбрала модель данных и определила эти данные для вас (в значительной степени по ее построению). В конечном счете, если вы работаете в Windows (и используя Win64), он 32бит для длинного и 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.