2015-04-12 4 views
4

я видел в /usr/include/limits.h, какСделайте длинный длинный и длинный одинаковый диапазон в C в 64-битной машине?

/* Minimum and maximum values a `signed long int' can hold. */ 
if __WORDSIZE == 64 
define LONG_MAX  9223372036854775807L 
else 
define LONG_MAX  2147483647L 
endif 
define LONG_MIN  (-LONG_MAX - 1L) 
/* Maximum value an `unsigned long int' can hold. (Minimum is 0.) */ 
if __WORDSIZE == 64 
define ULONG_MAX 18446744073709551615UL 
else 
define ULONG_MAX 4294967295UL 
endif 
ifdef __USE_ISOC99 

/* Minimum and maximum values a `signed long long int' can hold. */ 
define LLONG_MAX 9223372036854775807LL 
define LLONG_MIN (-LLONG_MAX - 1LL) 

/* Maximum value an `unsigned long long int' can hold. (Minimum is 0.) */ 
define ULLONG_MAX 18446744073709551615ULL 

Так unsigned long long int и unsigned long int, кажется, имеют одинаковую максимальную величину 18446744073709551615 ...

Означает ли это, что long long означает то же самое, как long в этом машина? Если да, то почему у нас есть отдельный спецификатор long long?

От чтения книг С, я ожидал, что long long будет в два раза размером long. Я что-то не так? (. Но да, я согласен со стандартами, которые int >= short int, long >= int, но это трудно переварить long long >= long)

+5

«так значит, что это означает, что long long означает то же самое, что и на этом устройстве. так почему же у нас есть отдельный длинный длинный спецификатор? »Mmmmh, потому что ваша машина не единственная машина на земле? – mathieu

+0

hmm .. Я думаю, что это будет одинаково для всех 64-разрядных машин Linux (может быть разным в окнах) ... проверьте ваш тоже? –

+1

См. [Что такое размер бит 'long' в 64-битной Windows?] (http: // stackoverflow.com/questions/384502/what-is-the-bit-size-of-long-on-64-bit-windows) На таких машинах 'long long' больше, чем' long'. На вашей машине два типа имеют одинаковый размер. Оба они полностью верны - привыкайте к этому. –

ответ

3

Вы спросили:

так это значит, что долго долго означает то же самое, как долго в этой машине

Имена типов различаются, даже если они имеют одинаковый размер.

так почему же у нас есть отдельный спецификатор long long? `

Язык определяет их как разные типы. Это зависит от платформы, какой размер интегрального числа использовать для их поддержки. В компиляторе вы используете long long и long имеют одинаковый размер. Возможно, что другой компилятор на одной платформе использует 64 бита для long long и 32 бит для long и int.

+0

ОК я отредактирую, чтобы спросить, что означает второе долгое время? –

+0

ya .. но вот так долго долго не полезно здесь? –

+0

ОК .. мои сомнения тогда ... если системы настолько различны в размерах бит, может быть 64 бит и 32 бит и могут быть windows и linux .. не сложно ли писать программное обеспечение, которое работает повсюду? –

5

Спецификация языка C определяет типы, которые должны соответствовать соответствующие реализации. Тип long [int] был среди них с первой версии стандарта, а тип long long [int] был среди них с C99.

Стандарт определяет отношения между размерами различных целочисленных типов, и, в частности, тип long long должен иметь возможность представлять все значения, вводимые long может представлять собой, но он оставляет многие аспекты характеристик типа «реализации определены», смысл реализации выбирают (и обязаны задокументировать их выбор). Среди этих характеристик имеются ли значения long long, которые находятся за пределами диапазона long.

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

Если вы заботитесь о диапазоне значений, что различные типов используемых вами могут представлять собой, а затем использовать равноширинных типы из stdint.h (int64_t, uint32_t и т.д.), или использовать стандартные макросы дающих пределы целого типа, (INT_MAX и друзья).

3

C имеет два вида интегральных типов:

  • traditionals: короткий, INT, долго, долго долго. Для каждой реализации необходимо определить, какой размер эти типы. C просто указывает, что sizeof (short) < = sizeof (int) < = sizeof (long) < = sizeof (длинный длинный) (ссылка 6.3.1.1 в final draft of C1X). С этими типами вы можете никогда не убедитесь, что один из них 32 или 64 бит, потому что он явно зависит от реализации.
  • explicits: int8_t, int16_t, int32_t, int64_t - если они существуют, вы можете быть уверены в их размере. Стандарт говорит, что они должны быть объявлены в stdint.h, но, к сожалению, все они необязательно - это означает, что вы не можете быть уверены, что они существуют, даже если все основные возможности поддержки int16_t, int32_t и int64_t (ref: 7.20 и 7.20.1.1 выше) проект)

и ... нет рекомендуется соотношение между traditionals и типами explicits (обратите внимание Наименования traditionals и explicits мои).

7.20.1 того же проекта определяет другие интересные виды:

  • intptr_t и uintptr_t: Респ. подписанных и неподписанных целые типы гарантированно быть достаточно большим, чтобы держать указатель (несчастию, эти типы ДОПОЛНИТЕЛЬНО ...)
  • int_least X _t: тип, по крайней мере Х бит
  • int_fast X _t: самый быстрый тип по крайней мере X битов

следующие типы требуется (это означает, что они должны существовать в любой совместимой реализации):

int_least8_t int_least16_t int_least32_t int_least64_t uint_least8_t uint_least16_t uint_least32_t uint_least64_t

int_fast8_t int_fast16_t int_fast32_t int_fast64_t uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t

  • intmax_t и uintmax_t: сиг ned (resp unsigned) целочисленный тип, способный представлять любое значение любого подписанного (соответственно без знака) целочисленного типа - требуется
+0

Не упоминается «наименее» или «быстрый» явный тип? –

+0

@JonathanLeffler: это явно не требовалось OP, но я должен признать, что ответ теперь более совершенен –

+0

К сожалению, покрывая дополнительные типы, он не может быть столь же лаконичным, как и без упоминания их (вы покрываете вдвое больше типы, как раньше), но (как вы заметили) «наименьший» и «быстрый» типы надежно присутствуют (в отличие от точных типов) и поэтому имеют значение. –

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