Сначала вам нужно понять, как переменные хранят данные.
В 64-битной архитектуре тип int имеет 4 байта (либо тип C long, независимо от архитектуры), поэтому может хранить следующие значения:
00000000 00000000 00000000 00000000 = 0 (десятичное значение)
01111111 11111111 11111111 11111111 = 2 147 483 647 (десятичное значение)
11111111 11111111 11111111 11111111 = 4 294 967 294 (без знака) 1009 *
11111111 11111111 11111111 11111111 = -1 (десятичное значение со знаком)
Обратите внимание, что целочисленные типы могут использовать старший значащий бит (MSB) для представления сигнала (от 0 до положительного, от 1 до отрицательного), используя a modular aritmeti c.
Подробнее о целочисленном сигнале: https://en.wikipedia.org/wiki/Two%27s_complement
Итак, чтобы хранить десятичные данные выше INT_MAX, вам нужно больше байтов, чем у вас есть тип int. Хороший способ, совместимый с 64-битной архитектурой, использует тип long long.
Тип long long использует 8 байтов, поэтому может хранить значение выше INT_MAX.
Вам нужно будет объявить: long long n;
И используйте scanf () следующим образом: scanf("%lld%c", &n, &ch);
Ваш fflu sh (stdin) должен быть после scanf (), потому что если ваше приложение нарушит l oop после того, как scanf () и до того, как достигли инструкции fflu sh (), могут возникнуть проблемы при дальнейшей обработке ввода. Примерно так:
check = scanf("%lld%c", &n, &ch);
fflush(stdin);
Однако некоторые разработчики не одобряют использование fflu sh () в стандартном вводе, поэтому это альтернатива (немного более сложная) с использованием getch (), принимающего только числа и конвертирующего char * в long long с использованием strtoll ():
char c = 0;
char* input_number = malloc(32);
int accepted_chars = 0;
memset(input_number, 0, 32);
while(c != '\r'){ //loop until user press ENTER
c = getch();
//receive numbers keys pressed
if(c >= '0' && c <= '9'){
*(input_number + accepted_chars) = c;
accepted_chars ++;
printf("%c", c);
}
//receive backspace key pressed
if(c == 8){
if(accepted_chars > 0){ //don't do nothing if there is nothing to clear
accepted_chars --;
*(input_number + accepted_chars) = 0;
printf("\b");
printf(" ");
printf("\b");
}
}
}
printf("\n");
char* endptr;
n = strtoll(input_number, &endptr, 10); //convert string in base 10 (decimal) long long type