2010-09-29 4 views
4

На моей системе, я получаю:int v/s. долго в C

sizeof (int) = 4 
sizeof (long) = 4 

Когда я проверил с программой C, как int & long переполняется к отрицательному после:

a = 2147483647; 
a++; 

Если оба могут представлять собой то же самое диапазон чисел, почему я бы использовал ключевое слово long?

+0

Попробуйте выполнить компиляцию кода в режиме 64 бит и посмотреть, получаете ли вы те же результаты. – JeremyP

ответ

7

int имеет минимальный диапазон -32767 до 32767, в то время как long имеет минимальный диапазон -2147483647 до 2147483647.

Если вы пишете переносимый код, который может иметь для компиляции на различных реализациях C, то вы должны используйте long, если вам нужен этот диапазон. Если вы пишете не переносимый код для одной конкретной реализации, тогда вы правы - это не имеет значения.

+4

Используйте типы из 'stdint.h', когда размер имеет значение. –

+2

В большинстве случаев требуется минимальный гарантированный диапазон, и в этом случае стандартные типы являются достаточными. В случаях, когда ваши требования более узкие, могут быть полезны типы из ''. – caf

+0

Следует отметить, что POSIX требует, чтобы 'int' был как минимум 32-битным, и, конечно, Windows имеет 32-битный' int'. Код, который работает в Windows и любой системе POSIX, безусловно, имеет более высокий уровень переносимости. :-) –

0

Я думаю, что это больше проблема компилятора в наши дни, поскольку компьютеры пошли намного быстрее и требуют большего количества чисел, как это было раньше.

0

На другой платформе или с другим компилятором int и long могут быть разными. Если вы не планируете переносить свой код на что-либо еще или использовать другую машину, выберите тот, который вы хотите, это не изменит ситуацию.

6

Поскольку SizeOf (INT) == SizeOf (длинная) не всегда верно. int normaly представляет самый быстрый размер с размером не менее 2 * 8 бит. с другой стороны, по крайней мере 4 * 8 бит.

+0

они различаются по 64-битным режимам, например. int 32bit для обоих режимов (по крайней мере, для Solaris), но он варьируется между платформами, как вы говорите. –

0

Размер встроенных типов данных зависит от реализации C, но все они имеют минимальные диапазоны. В настоящее время int обычно составляет 4 байта (32 бит), поскольку большинство ОС 32-разрядные. Обратите внимание, что char всегда будет 1 байт.

+1

sizeof (char) всегда будет 1, но CHAR_BITS не обязательно должен быть 8. Совершенно легально иметь 32-битные символы, а если ints также 32-бит, sizeof (int) будет равен 1. – Sjoerd

+0

I «Никогда не слышал о 8-битном байте. –

+0

POSIX требует 'CHAR_BIT == 8', и, конечно, у Windows есть' CHAR_BIT == 8', поэтому для всех целей и задач 'CHAR_BIT' составляет 8. Заметными исключениями являются древние универсальные мэйнфреймы (в значительной степени несущественные, где' CHAR_BIT' часто бывает 9 или 10) и DSP (где 'CHAR_BIT' может быть 32 и' sizeof (char) ',' sizeof (short) ',' sizeof (int) 'и' sizeof (long) 'all 1. –

5

C определяет количество целочисленных типов и определяет отношение их размеров. В основном, это говорит о том, что sizeof (long long)> = sizeof (long)> = sizeof (int)> = sizeof (short)> = sizeof (char), а sizeof (char) == 1.

Но фактические размеры не определены и зависят от архитектуры, на которой вы работаете. На 32-битном ПК, int и long обычно четыре байта, а long long - 8 байт. Но в 64-битной системе длина обычно составляет 8 байтов и, следовательно, отличается от int.

Существует также тип, называемый uintptr_t (и intptr_t), который гарантированно имеет тот же размер, что и указатели данных.

Важно помнить, что не следует предполагать, что вы можете хранить значения указателя в long или int. Переносимость, вероятно, важнее, чем вы думаете, и вполне вероятно, что вы захотите скомпилировать свой код в 64-разрядной системе в ближайшем будущем.

+0

Я не могу найти абзац в стандарте C89, где говорится, что sizeof (long)> = sizeof (int) .Таким образом, я думаю, что допустимо, что sizeof (long)

+0

@Juri из 2.2.4.2. Численные пределы: их , определенные реализацией va должно быть равным или больше величиной (абсолютное значение) для показанных с одинаковым знаком. – Christoffer

+1

@ Juri Robl: В стандарте C89 в §3.1.2.5 говорится: «В списке обозначенных целочисленных типов выше диапазон значений каждого типа является поддиапазоном значений следующего типа в списке». *. В стандарте C99 это §6.2.5p8 (диапазон типа с меньшим целым числом ранга преобразования должен быть поддиапазоном типов с большим целым числом ранга преобразования) вместе с §6.3.1.1p1 ('long int' имеет больший целочисленный ранг преобразования чем 'int'). – caf

0

Размер данных зависит от компилятора. Различные компиляторы имеют различный размер int и других типов данных.

Так что если вы создадите код, который будет запущен на различной машине, вы должны использовать длинный или он зависит от диапазона значения, которое может иметь переменная, которую может иметь эта переменная.

Смежные вопросы