2016-04-12 13 views
0

Я использую Codeblocks и компилятор GNU на компьютере под управлением Windows. При запуске компилятора, он делает это при следующих условиях:Как использовать большие целые числа в программе на C?

mingw32-gcc.exe -Wall -g -std=c11 <filename> -o obj\Debug\main.o 

Мой код выглядит следующим образом:

#include <stdio.h> 
#include <limits.h> 

int main() 
{ 
    printf("INTEGER min: %d\n", INT_MIN); 
    printf("INTEGER max: %d\n\n", INT_MAX); 
    printf("UNSIGNED INTEGER max: %u\n\n", UINT_MAX); 
    printf("LONG INTEGER min: %ld\n", LONG_MIN); 
    printf("LONG INTEGER max: %ld\n\n", LONG_MAX); 
    //printf("LONG LONG INTEGER min: %lld\n", LONG_LONG_MIN); 
    //printf("LONG LONG INTEGER max: %lld\n\n", LONG_LONG_MAX); 
    printf("UNSIGNED LONG INTEGER max: %lu\n\n", ULONG_MAX); 
    //printf("UNSIGNED LONG LONG INTEGER max: %lld\n", ULONG_LONG_MAX); 
    printf("\n"); 
    return 0; 
} 

Мой выход для этого кода:

INTEGER min: -2147483648 
INTEGER max: 2147483648 

UNSIGNED INTEGER max: 4294967295 

LONG INTEGER min: -2147483648 
LONG INTEGER max: 2147483648 

UNSIGNED LONG INTEGER max: 4294967295 

линии со ссылкой на ДЛИННЫЕ ДЛИННЫЕ Целочисленные числа закомментированы, поскольку компилятор выдавал ошибки:

error: 'LONG_LONG_MIN' undeclared (first use in this function) 
error: 'LONG_LONG_MAX' undeclared (first use in this function) 
error: 'ULONG_LONG_MAX' undeclared (first use in this function) 

Однако при наборе кода CodeBlocks предоставил подсказку кода, указывающую на то, что я мог использовать константы LONG_LONG. Следовательно, мне нужны ответы на следующие вопросы:

  1. Почему целые числа и длинные целые числа имеют одинаковые пределы? Должны ли длинные целые числа иметь больший диапазон значений?
  2. Почему у меня возникают проблемы с константами LONG_LONG? Означает ли это, что я не могу использовать длинные длинные целые числа?

Благодаря

+0

Возможного дубликата вопроса. Проверьте http://stackoverflow.com/questions/13590735/printf-long-long-int-in-c-with-gcc –

+0

@JamesMcCormac: связанный, но определенно другой вопрос. –

ответ

9

Константы вы ищете не называются LONG_LONG_.... Проверьте свой заголовок limits.h. Скорее всего, вы после ULLONG_MAX, LLONG_MAX и т.д.

+0

Спасибо, что решил второй вопрос. Однако, как насчет первого? –

+0

Кроме того, я получил константы LONG_LONG от 'limits.h'. Он содержит оба набора констант. Очевидно, я понятия не имею, почему. :) –

4

Константы LLONG_MAX, ULLONG_MAX и т.д.

Как почему int и long int имеют такое же значение, винить стандарт C: он не определяет фиксированное количество бит для каждого типа данных, только минимальное количество бит:

  • int должен быть по крайней мере 16 бит
  • long int должен быть т не менее 32 бита
  • long long int должен быть по крайней мере 64 бита

Точное число битов отличается от ОС OS.

#include <stdio.h> 
#include <limits.h> 

int main() 
{ 
    printf("INTEGER min: %d\n", INT_MIN); 
    printf("INTEGER max: %d\n\n", INT_MAX); 
    printf("UNSIGNED INTEGER max: %u\n\n", UINT_MAX); 
    printf("LONG INTEGER min: %ld\n", LONG_MIN); 
    printf("LONG INTEGER max: %ld\n\n", LONG_MAX); 
    printf("LONG LONG INTEGER min: %lld\n", LLONG_MIN); 
    printf("LONG LONG INTEGER max: %lld\n\n", LLONG_MAX); 
    printf("UNSIGNED LONG INTEGER max: %lu\n\n", ULONG_MAX); 
    printf("UNSIGNED LONG LONG INTEGER max: %llu\n", ULLONG_MAX); 
    printf("\n"); 
    return 0; 
} 

На мой Mac OS X, 64-бит, который печатает:

INTEGER min: -2147483648 
INTEGER max: 2147483647 

UNSIGNED INTEGER max: 4294967295 

LONG INTEGER min: -9223372036854775808 
LONG INTEGER max: 9223372036854775807 

LONG LONG INTEGER min: -9223372036854775808 
LONG LONG INTEGER max: 9223372036854775807 

UNSIGNED LONG INTEGER max: 18446744073709551615 

UNSIGNED LONG LONG INTEGER max: 18446744073709551615 

Edit: если вы хотите писать переносимый код и фиксированной ширины целых чисел, используйте stdint.h :

#include <stdint.h> 

printf("int64_t max : %lld\n\n", INT64_MAX); // 9223372036854775807 
printf("uint64_t max: %llu\n\n", UINT64_MAX); // 18446744073709551615 
+0

Хорошо. После фиксации длинных длинных констант, я получаю то же значение, которое вы показываете для длинных длинных целых чисел. Итак, в основном, если мне нужно использовать целое число больше INTEGER, мне нужно будет использовать LONG LONG INTEGER? –

+0

См. Мой отредактированный ответ –

+0

Спасибо большое ... это очень полезно. –

2

Почему целые числа и длинные целые числа имеют одинаковые пределы? Должны ли длинные целые числа иметь больший диапазон значений?

Вы вошли в один из отличительных признаков языка C - его адаптируемость.

С определяет диапазон int быть по крайней мере так велик, как short и диапазон long быть по крайней мере так велик, как int. Все имеют минимальные диапазоны.

Вместо точного определения диапазона short, int, long, C выбрал универсальность. На платформе OP диапазон int соответствует диапазону long (32-разрядный). На многих встроенных процессорах 2016 года (и домашних компьютерах 70-х, 80-х годов) диапазон int соответствует диапазону short (16 бит). На некоторых платформах (64-разрядная) диапазон int превышает short, а уже, чемlong. Так что прямо на вопрос OP: int не всегда имеет тот же диапазон, что и long.

Фокус в том, что int - это не просто очередная ступень лестницы singed char, short, int, long, long long. Это целочисленный тип. Учитывая обычных целых рекламных акций, все типы сужений повышаются до int. intчасто базовая ширина бит процессора.

Большая часть кода написана с int как 32-разрядная, а также большой процент как 16-бит. С 64-битными процессорами возможно наличие int в качестве 64-битного, но для signed char, short для 8, 16 и 32-разрядных данных это всего лишь 2 стандартных типа.

Двигаясь вперед, простой подсчет на signed char диапазоне <=short диапазон, диапазон short<=int диапазон, диапазон int<=long диапазон и т.д. Кроме того, что signed char по меньшей мере, 8-бит, short, int по крайней мере, 16- бит, long не менее 32 бит, long long не менее 64 бит. Если код нуждается в явной ширине, используйте int8_t, int16_t и т. Д.

Тот факт, что C используется спустя 40 лет, свидетельствует о том, что эта универсальность имеет/имела заслуги.

[Обсуждение опущены беззнаковые типы, _Bool_t и char для краткости. Также исключены редкие типы не-2-х типов (9, 18, 24, 36 и т. Д.)]

+1

Также обратите внимание на то, что Windows выбрала манекен [LLP64] (https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models). В LP64 (выбранном большинством систем Linux) longs представляют собой 64-битные целые числа. – jdarthenay

+0

@jdarthenay Спасибо за полезную ссылку. – chux

1

Кроме ограничений.h на систему с конкретной реализацией, также проверьте, что стандарт C определяет пределы различные целые числа:

Значения, приведенные ниже, должны быть заменены постоянными выражениями, подходящими для использования в директивах предварительной обработки #if . Кроме того, кроме CHAR_BIT и MB_LEN_MAX, следующие заменяются выражениями, которые имеют тот же тип, что и выражение , которое является объектом соответствующего типа, преобразованного в соответствии с целыми акциями.Их реализация определенных значения должны быть равны или больше по величине

(absolute value) to those shown, with the same sign. 
-- number of bits for smallest object that is not a bit-field (byte) 
    CHAR_BIT           8 
-- minimum value for an object of type signed char 
    SCHAR_MIN        -127 // -(27 - 1) 
-- maximum value for an object of type signed char 
    SCHAR_MAX        +127 // 27 - 1 
-- maximum value for an object of type unsigned char 
    UCHAR_MAX         255 // 28 - 1 
-- minimum value for an object of type char 
    CHAR_MIN        see below 
-- maximum value for an object of type char 
    CHAR_MAX        see below 
-- maximum number of bytes in a multibyte character, for any supported locale 
    MB_LEN_MAX         1 
-- minimum value for an object of type short int 
    SHRT_MIN        -32767 // -(215 - 1) 
-- maximum value for an object of type short int 
    SHRT_MAX        +32767 // 215 - 1 
-- maximum value for an object of type unsigned short int 
    USHRT_MAX        65535 // 216 - 1 
-- minimum value for an object of type int 
    INT_MIN         -32767 // -(215 - 1) 
-- maximum value for an object of type int 
    INT_MAX        +32767 // 215 - 1 
-- maximum value for an object of type unsigned int 
    UINT_MAX        65535 // 216 - 1 
-- minimum value for an object of type long int 
    LONG_MIN       -2147483647 // -(231 - 1) 
-- maximum value for an object of type long int 
    LONG_MAX       +2147483647 // 231 - 1 
-- maximum value for an object of type unsigned long int 
    ULONG_MAX       4294967295 // 232 - 1 
-- minimum value for an object of type long long int 
    LLONG_MIN   -9223372036854775807 // -(263 - 1) 
-- maximum value for an object of type long long int 
    LLONG_MAX   +9223372036854775807 // 263 - 1 
-- maximum value for an object of type unsigned long long int 
    ULLONG_MAX   18446744073709551615 // 264 - 1 

От http://www.iso-9899.info/n1570.html#5.2.4.2.1

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

  • Нет связанных вопросов^_^