Си: Какое максимальное число поместится в тип int (4 байта)?
418
19.03, в 15:18
printf("sizeof int = %d\n", sizeof(int));
Вывод:
sizeof int = 4
Под int 4 байта.

void ex2() {
	int max;
	max = 4294967296;
	printf("int max = %d\n", max);
}

Начиная с некоторого числа printf начинает выдавать отрицательные значения. Как посчитать максимальное число, помещающееся в int. Где про это почитать?
19.03, в 15:16
Я думал, что максимальное значение для int (4 байта) это 2^32 - 1
Но число 2^32 печатается как 0
Но число 2^32 - 1 печатается как -1
А число 2^32 - 2 печатается как -2
19.03, в 15:27
int - знаковое число, потому 1 бит отводится на хранение знака числа.
Максимальное значение int для 4 байт - 2^31 - 1.
Ответы (5)
Сортировать по:
  • Решение
    В вашем случае надо гуглить signed vs unsigned. По умолчанию типы являются знаковыми, поэтому реальные границы int [-2^31..2^31-1] . Посмотрите, как внутри записываются знаковые числа и вам станет понятно, почему выводятся именно такие значение
  • 2
    Учитесь пользоваться поиском.
    Размер большинства типов зависит от компилятора.
    Есть хеадер файл limits.h, который содержит минимальные-максимальные значения типов для конкретной системы и компилятора.
    По sizeof типа тоже можете высчитать максимальное значение.
  • 10
    Чукча не читатель, чукча писатель? Лень почитать книги, документацию и т.д.? Если хочется научиться программировать, то надо книги читать, а не на где-то задавать вопросы по основам.

    В любой книге по Си это описано.
  • printf("sizeof int = %d\n", sizeof(int));

    Ай ай ай! Кто же выводит беззнаковое число как знаковое?
    Более того, sizeof() возвращает size_t, который может иметь разный размер на разных платформах. Правильно было записать:
    printf("sizeof int = %zu\n", sizeof(int));
  • Константы из limits.h тебе в помощь!
    /* Minimum and maximum values a `signed short int' can hold.  */
    #  define SHRT_MIN      (-32768)
    #  define SHRT_MAX      32767
    
    /* Maximum value an `unsigned short int' can hold.  (Minimum is 0.)  */
    #  define USHRT_MAX     65535
    
    /* Minimum and maximum values a `signed int' can hold.  */
    #  define INT_MIN       (-INT_MAX - 1)
    #  define INT_MAX       2147483647
    
    /* Maximum value an `unsigned int' can hold.  (Minimum is 0.)  */
    #  define UINT_MAX      4294967295U
    
    /* 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
Написать ответ

Войдите, чтобы написать ответ

Войти через TM ID