В чем разница между int и long на C ++?

Поправьте меня, если я ошибаюсь,

int – 4 байта, с диапазоном значений от -2,147,483,648 до 2,147,483,647 (2 ^ 31)
длиной 4 байта, с диапазоном значений от -2,147,483,648 до 2,147,483,647 (2 ^ 31)

В чем разница в C ++? Можно ли их использовать взаимозаменяемо?

Это зависит от реализации.

Например, в Windows они одинаковы, но, например, в Alpha-системах длинное было 64 бита, тогда как int было 32 бита. В этой статье описываются правила для компилятора Intel C ++ на переменных платформах. Обобщить:

  OS arch size Windows IA-32 4 bytes Windows Intel 64 4 bytes Windows IA-64 4 bytes Linux IA-32 4 bytes Linux Intel 64 8 bytes Linux IA-64 8 bytes Mac OS X IA-32 4 bytes Mac OS X Intel 64 8 bytes 

Единственная гарантия, которая у вас есть:

 sizeof(char) == 1 sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long) // FROM @KTC. The C++ standard also has: sizeof(signed char) == 1 sizeof(unsigned char) == 1 // NOTE: These size are not specified explicitly in the standard. // They are implied by the minimum/maximum values that MUST be supported // for the type. These limits are defined in limits.h sizeof(short) * CHAR_BIT >= 16 sizeof(int) * CHAR_BIT >= 16 sizeof(long) * CHAR_BIT >= 32 sizeof(long long) * CHAR_BIT >= 64 CHAR_BIT >= 8 // Number of bits in a byte 

Также см.: Гарантировано ли long время как минимум 32 бита?

При компиляции для x64 разница между int и long находится где-то между 0 и 4 байтами, в зависимости от того, какой компилятор вы используете.

GCC использует модель LP64, что означает, что ints 32-битные, но longs 64-бит в режиме 64-бит.

Например, MSVC использует модель LLP64, что означает, что и ints, и longs являются 32-битными даже в 64-битном режиме.

Сама спецификация C ++ (старая версия, но достаточно хорошая для этого) оставляет это открытым.

Существует четыре знаковых целочисленных типа: « signed char », « short int », « int » и « long int ». В этом списке каждый тип содержит как минимум столько же памяти, сколько и предшествующие ему в списке. Plain ints имеют естественный размер, предложенный архитектурой среды исполнения *;

[Сноска: достаточно большой, чтобы содержать любое значение в диапазоне INT_MIN и INT_MAX, как определено в заголовке . — end foonote]

Как указывает Кевин Хейнс, ints имеет естественный размер, предлагаемый средой исполнения, которая должна соответствовать INT_MIN и INT_MAX.

В стандарте C89 указано, что UINT_MAX должен быть не менее 2 ^ 16-1, USHRT_MAX 2 ^ 16-1 и ULONG_MAX 2 ^ 32-1. Это делает бит-счет как минимум 16 для краткости и int, а 32 для длинных. Для char он явно указывает, что он должен иметь не менее 8 бит ( CHAR_BIT ). C ++ наследует эти правила для файла limits.h, поэтому в C ++ у нас есть те же основные требования к этим значениям. Однако вам не следует, что int составляет не менее 2 байт. Теоретически, char, int и long могут быть 1 байт, и в этом случае CHAR_BIT должен быть не менее 32. Просто помните, что «байт» всегда является размером символа, поэтому, если char больше, байт – это не только 8 бит больше.

Это зависит от вашего компилятора. Вам гарантировано, что длинный будет не меньше, чем int, но вам не гарантируется, что он будет больше.

По большей части количество байтов и диапазон значений определяется архитектурой процессора не C ++. Тем не менее, C ++ устанавливает минимальные требования, которые правильно объяснял litb, и Мартин Йорк сделал несколько ошибок.

Причина, по которой вы не можете использовать int и long взаимозаменяемо, состоит в том, что они не всегда одинаковой длины. C был изобретен на PDP-11, где байт имел 8 бит, int был двумя байтами и мог обрабатываться непосредственно аппаратными инструкциями. Поскольку программистам C часто нужна четырехбайтная арифметика, давно изобретено, и это было четыре байта, обработанные библиотечными функциями. Другие машины имели разные спецификации. Стандарт C наложил некоторые минимальные требования.

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

Большинство поставщиков компиляторов предоставляют файл заголовка, который определяет примитивные типы с разным типом размера. Эти примитивные типы должны использоваться, когда когда-либо код может быть потенциально перенесен в другой компилятор (прочитайте это как ВСЕГДА в КАЖДОМ экземпляре). Например, большинство компиляторов UNIX имеют int8_t uint8_t int16_t int32_t uint32_t . Microsoft имеет INT8 UINT8 INT16 UINT16 INT32 UINT32 . Я предпочитаю int8 uint8 int16 uint16 int32 uint32 Borland / CodeGear. Эти имена также дают небольшое напоминание о размере / диапазоне заданного значения.

В течение многих лет я использовал явные примитивные имена Borland и #include следующий заголовочный файл C / C ++ (primitive.h), который предназначен для определения явных примитивных типов с этими именами для любого компилятора C / C ++ (этот заголовочный файл может на самом деле не быть охватывают каждый компилятор, но он охватывает несколько компиляторов, которые я использовал в Windows, UNIX и Linux, но также не определяет 64-битные типы).

 #ifndef primitiveH #define primitiveH // Header file primitive.h // Primitive types // For C and/or C++ // This header file is intended to define a set of primitive types // that will always be the same number bytes on any operating operating systems // and/or for several popular C/C++ compiler vendors. // Currently the type definitions cover: // Windows (16 or 32 bit) // Linux // UNIX (HP/US, Solaris) // And the following compiler vendors // Microsoft, Borland/Imprise/CodeGear, SunStudio, HP/UX // (maybe GNU C/C++) // This does not currently include 64bit primitives. #define float64 double #define float32 float // Some old C++ compilers didn't have bool type // If your compiler does not have bool then add emulate_bool // to your command line -D option or defined macros. #ifdef emulate_bool # ifdef TVISION # define bool int # define true 1 # define false 0 # else # ifdef __BCPLUSPLUS__ //BC++ bool type not available until 5.0 # define BI_NO_BOOL # include  # else # define bool int # define true 1 # define false 0 # endif # endif #endif #ifdef __BCPLUSPLUS__ # include  #else # ifdef unix # ifdef hpux # include  # endif # ifdef sun # include  # endif # ifdef linux # include  # endif # define int8 int8_t # define uint8 uint8_t # define int16 int16_t # define int32 int32_t # define uint16 uint16_t # define uint32 uint32_t # else # ifdef _MSC_VER # include  # define int8 INT8 # define uint8 UINT8 # define int16 INT16 # define int32 INT32 # define uint16 UINT16 # define uint32 UINT32 # else # ifndef OWL6 // OWL version 6 already defines these types # define int8 char # define uint8 unsigned char # ifdef __WIN32_ # define int16 short int # define int32 long # define uint16 unsigned short int # define uint32 unsigned long # else # define int16 int # define int32 long # define uint16 unsigned int # define uint32 unsigned long # endif # endif # endif # endif #endif typedef int8 sint8; typedef int16 sint16; typedef int32 sint32; typedef uint8 nat8; typedef uint16 nat16; typedef uint32 nat32; typedef const char * cASCIIz; // constant null terminated char array typedef char * ASCIIz; // null terminated char array #endif //primitive.h 

Стандарт C ++ говорит так:

3.9.1, §2:

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

(44), который достаточно велик, чтобы содержать любое значение в диапазоне INT_MIN и INT_MAX, как определено в заголовке .

Вывод: это зависит от того, на какой архитектуре вы работаете. Любое другое предположение неверно.

  • Расширение скобы с переменной?
  • Создание нескольких нумерованных переменных на основе int
  • Вычисление суммы двух переменных в пакетном скрипте
  • Печать всех глобальных переменных / локальных переменных?
  • Переменные среды в Mac OS X
  • Какова область действия переменной, инициализируемой в выражении if?
  • Почему имена переменных не начинаются с цифр?
  • Неинициализированные переменные и члены в Java
  • Разница между статическими и частными статическими переменными
  • Переменные Javascript в атрибутах HTML
  • Захват вывода нескольких строк в переменную Bash
  • Давайте будем гением компьютера.