C: Почему целое число действует как длинное целое? - PullRequest
2 голосов
/ 11 марта 2011

Из того, что я знаю, целое число находится в диапазоне от 32 768 до 32 767.Длинное целое число находится в диапазоне от 2 147 483 648 до 2 147 483 647.Я дважды проверил wikipedeia, чтобы убедиться.

Проблема сейчас:

int a=2147483647;
printf("a: %d\n", a);

Почему это работает?Если я добавлю 1 к 2147483647, то он напечатает мусор, чего следует ожидать, если переменная является длинным целым числом.Но почему это позволяет мне назначать длинное целое число целому числу?

Ответы [ 4 ]

11 голосов
/ 11 марта 2011

Из того, что я знаю, целое число находится в диапазоне от 32 768 до 32 767.

Это неверно.Диапазон int составляет по меньшей мере от -32 767 до 32 767;он может иметь больший диапазон и на большинстве 32-битных и 64-битных платформ это делает.

Вы можете узнать диапазон типа int на вашей платформе, проверив INT_MAX и INT_MINмакросы, определенные в <limits.h>.

5 голосов
/ 11 марта 2011

То, что вы знаете, неверно.

В отличие от некоторых других языков, таких как Java, точный размер int и long в C определяется реализацией (без установленных ограничений).Ясно, что вы используете платформу, где int имеет ширину 32 бита, но на других платформах это может быть 16 бит, а на некоторых платформах int имеет ширину 64 бита.

Аналогично, на некоторых платформахlong имеет ширину 32 бита;на других он имеет ширину 64 бита.Это могло бы быть еще шире, если бы платформа решила сделать это так.

4 голосов
/ 11 марта 2011

Реальная ширина int обычно зависит от реализации. Вы можете использовать константы INT_MAX/INT_MIN в заголовке limits.h, чтобы узнать, каков реальный диапазон.

На компьютере x86 значение int обычно составляет 4 байта, поэтому 2 ^ 31-1 действительно является максимальным значением, которое он может иметь.

3 голосов
/ 11 марта 2011

sizeof (короткий) <= sizeof (int) <= sizeof (long) </p>

...