Почему " 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 по определению.