Разница между типами данных long и int

Учитывая, что следующие операторы возвращают 4, в чем разница между типами int и long в C ++?

sizeof(int)
sizeof(long)

person Alex    schedule 22.05.2009    source источник
comment
На вопрос и ответ: stackoverflow.com/questions/271076/   -  person Martin York    schedule 23.05.2009


Ответы (6)


Из этой ссылки:

Первоначально предполагалось, что int будет «естественным» размером слова процессора. Многие современные процессоры могут с одинаковой легкостью обрабатывать слова разного размера.

Также этот бит:

Во многих (но не во всех) реализациях C и C ++ long больше int. Самые популярные современные настольные платформы, такие как Windows и Linux, работают в основном на 32-битных процессорах, и большинство компиляторов для этих платформ используют 32-битное int, которое имеет такой же размер и представление, как long.

person Paul Sonier    schedule 22.05.2009

Стандарт дает следующие гарантии:

1 == sizeof(char) <= sizeof(short) <= sizeof (int) <= sizeof(long) <= sizeof(long long)

Так что совершенно верно, что sizeof (int) и sizeof (long) равны, и многие платформы предпочитают использовать этот подход. Вы найдете некоторые платформы, где int - 32 бита, long - 64 бита, а long long - 128 бит, но для sizeof (long) очень часто бывает 4.

(Обратите внимание, что long long распознается в C, начиная с C99, но обычно реализовывалось как расширение в C ++ до C ++ 11.)

person Dan Olson    schedule 22.05.2009
comment
Это полезная информация. Есть процессоры + компиляторы, где sizeof (char)! = Sizeof (short). Детали сейчас становятся немного туманными, но я считаю, что один процессор, над которым я работал, не мог адресовать менее 16 бит. Компилятору пришлось проделать большую работу, чтобы сделать sizeof (char) == 1. - person Craig Lewis; 23.05.2009
comment
@CraigLewis: ты имеешь в виду ... где sizeof(char)==sizeof(short), верно? - person Walter Tross; 04.09.2013
comment
Я считаю, что на некоторых машинах Cray было sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int) && sizeof(int) == 1, и этот размер составлял не менее 32 бита. - person Jonathan Leffler; 18.01.2015
comment
Машины Cray, особенно Cray SV1, были интересны. У них были 8-битные символы. Объявление одного символа заняло бы все 64-битное слово и потратило немного места. Для массива символов или нескольких символов в структуре компилятор автоматически упаковывает 8-битные символы вместе в 64-битные слова. Указатели char также были больше, чем другие указатели, они должны были хранить адрес 64-битного слова, а также место в слове упакованного char. - person user1942027; 19.04.2015

Вы работаете на 32-битной машине или 64-битной машине с Windows. На моей 64-битной машине (под управлением ОС Unix, а не Windows) sizeof(int) == 4, но sizeof(long) == 8.

Они разных типов - иногда одного размера, иногда нет.

(В старые времена sizeof(int) == 2 и sizeof(long) == 4 - хотя, если подумать, это могло быть за дни до того, как C ++ существовал. Тем не менее, технически это законная конфигурация, хотя и необычная за пределами встроенного пространства, и, вполне возможно, необычная даже во встроенном пространстве.)

person Jonathan Leffler    schedule 22.05.2009
comment
Обратите внимание, что это зависит от компилятора, а также от машины. В MSVC sizeof (long) == 4 даже в 64-битной Windows. - person Steve Jessop; 23.05.2009
comment
Конечно, но я не использую 64-битную машину Windows. Но да, мое утверждение «Вы находитесь на 32-битной машине» слишком разительно; это может быть Вы на 32-битной машине или Windows, что было бы педантично точным. - person Jonathan Leffler; 23.05.2009
comment
Я не думаю, что ваше первое утверждение было настолько неточным, насколько это было справедливое предположение. Меня беспокоит, что второй вариант может привести к тому, что люди неправильно подумают, что ваши длинные значения равны 8 байтам, что является необходимым следствием того, что ваша машина 64-битная, хотя на самом деле это косвенное свойство вашего компилятора. - person Steve Jessop; 23.05.2009
comment
Многие люди используют 64-битные окна. Это очень большая группа людей, которым вы дали неверный размер sizeof(long), что вряд ли педантично. Так что я со Стивом. - person Cookie; 22.05.2015
comment
@Cookie: В 2009 году гораздо меньше людей использовали 64-битную Windows. В наши дни очень много людей используют 64-битную Windows. - person Jonathan Leffler; 22.05.2015

На платформах, где они имеют одинаковый размер, ответ - ничто. Оба они представляют собой 4-байтовые значения со знаком.

Однако вы не можете полагаться на это. Стандарт окончательно не определяет размер long и int. Компиляторы могут указывать типам разные размеры и, следовательно, нарушать это предположение.

person JaredPar    schedule 22.05.2009

Длинное число должно быть как минимум того же размера, что и int, и, возможно, но не обязательно, длиннее.

В обычных 32-битных системах и int, и long являются 4-байтовыми / 32-битными, и это действительно согласно спецификации C ++.

В других системах и int, и long long могут иметь другой размер. Раньше я работал на платформе, где int было 2 байта, а long - 4 байта.

person abelenky    schedule 22.05.2009

Типичная передовая практика - не использовать напрямую long / int / short. Вместо этого, в соответствии со спецификацией компиляторов и ОС, оберните их в файл заголовка, чтобы гарантировать, что они содержат именно то количество бит, которое вам нужно. Затем используйте int8 / int16 / int32 вместо long / int / short. Например, в 32-битном Linux вы можете определить такой заголовок

typedef char int8;
typedef short int16;
typedef int int32;
typedef unsigned int uint32;
person fwlx    schedule 28.05.2013
comment
Нет необходимости их определять; они уже включены в стандартный файл заголовка под названием <cstdint>, см. здесь: en.cppreference.com / w / cpp / types / integer - person jogojapan; 28.05.2013
comment
@jogojapan да, мы всегда должны отдавать предпочтение стандартным определениям, если это возможно. Но если код требует достаточной совместимости для компиляции на какой-нибудь старой ОС / компиляторе, то ручное кодирование таких вещей обеспечит это. В каждом варианте есть свои плюсы и минусы :) - person fwlx; 29.05.2013