Почему " long int "имеет тот же размер, что и"int"? Работает ли этот модификатор вообще?
Эм.. Я вроде', Хотя это модификаторы, как долго / короче расширяет / уменьшает объем памяти, выделенной при создании переменной, но...
#include <stdio.h>
#define test_int int
#define long_int long int
#define long_long_int long long int
void main()
{
printf("%in", sizeof (test_int)); //output 4
printf("%in", sizeof (long_int)); //output 4. Why? wasn't I modified it's size?
printf("%in", sizeof (long_long_int)); //output 8
}
по неизвестным причинам, он печатает размере int и длинный int как же. Я использую VC++ 2010 express edition. Извините, трудно найти ответ в google, он всегда показывает долго и int как отдельные типы.
6 ответов
причина, по которой MS выбирает сделатьlong
32 бита даже в 64-битной системе заключается в том, что существующий Windows API по историческим причинам использует смесь int
и long
для подобных вещей, и ожидание заключается в том, что это S 32-битное значение (некоторые из них восходит к временам, когда Windows была 16-битной системой). Поэтому, чтобы сделать преобразование старого кода в новую 64-битную архитектуру, они решили сохранить long
на 32 битах, так что приложения смешивания int
и long
в различных местах все равно компилировать.
в стандарте C++ нет ничего, что диктует, что a long
должно быть больше int
(это, конечно, не в большинстве 32-битных систем). Все стандарт говорит, что размер short
int long - и это short
не менее 16 бит, если память служит [не обязательно выражается как "должно быть не менее 16 бит", я думаю, что он упоминает диапазон значений].
все, что требует стандарт, это:
sizeof(char) == 1
и
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
(и что соответствующие неподписанные типы имеют тот же размер, что и знаковый тип.)
кроме того, есть минимальные размеры для каждого типа, косвенно
задается ограничениями на значения INT_MAX
, etc.: a char
должно быть не менее 8 бит, а short
и int
16, a long
32
и long long
64.
на 16 битных платформах, обычно для обоих short
и int
для
быть 16 бит; на 32 битных платформах (и 36 и 48 битных платформах
которые еще существуют),int
и long
почти всегда одинаковые
размер. На современных 64-битных платформах (с байтовой адресацией),
рациональным решением было бы сделать так, чтобы все четыре типа имели разные
размеры (хотя можно утверждать, что в соответствии со стандартом,
int
должно быть 64 бита, что означало бы, что int
, long
и long
long
все имели одинаковый размер).
реализации C и c++, long больше или равно int. Сегодня самые популярные настольные платформы, такие как Windows и Linux, работают в основном на 32-битных процессорах, а большинство компиляторов для этих платформ используют 32-битный int, который имеет тот же размер и представление, что и long.
в 64-битном компиляторе как int, так и log int имеют 4 байта.
Если вы находитесь в windows, перейдите по ссылке ниже: http://msdn.microsoft.com/en-us/library/s3f49ktz%28v=vs.90%29.aspx
вы можете найти некоторую информацию в одном другом обсуждении: каков размер бит long на 64-битных Windows?
вот заказ
char
short (int)
int
long (int)
long long (int)
стандарт требует, чтобы sizeof(char) == 1
- Это правда.
Стандарт также требует, чтобы: int
не менее 16 бит. long int
не менее 32 бит и long long int
не менее 64 бит.
С 32-битными процессорами, являющимися maintstream, компиляторы обычно устанавливают int
быть 4 байта.
Расширение не произошло снова на 64-битных системах (для MSVC в любом случае) ради совместимости.
дело в том, что вы неправильно понимаете значение int и long (это не прилагательное).
стандарт определяет, что число битов в каждом типе требует, чтобы это отношение оставалось на месте:
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long).
int
, само по себе, может быть до тех пор, как short
до тех пор, пока long
в зависимости от способа реализации задуманного.
разработчики компиляторов стремятся максимизировать производительность int
арифметика, что делает его естественным размер для базового процессора или ОС и настройка других типов соответственно.
но использование long int
С int
можно опустить, это то же самое, что и long
по определению.