Длинные 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.