long int range в программировании на C

По ссылке https://www.geeksforgeeks.org/data-types-in-c/2

Если мы предположим long intзанимает 8 байтов (64 бита), тогда его диапазон должен быть от -2^63 до 2^63-1, но это не указано в приведенной выше ссылке. Почему это так?

И аналогично unsigned long int должен иметь диапазон от 0 до 2^64 .

Подскажите пожалуйста какой будет ассортимент для float, double а также long double поскольку это не упоминается в ссылке.

4 ответа

Если мы предположим long int занимает 8 байтов (64 бита), тогда его диапазон должен быть -2^63 к 2^63-1, но этого нет в приведенной выше ссылке. Почему это так?

Потому что GeeksForGeeks - известный источник некорректности и ложности. Не верь им. Доверьтесь официальным стандартам и авторитетным авторам с многолетним опытом (как вы можете найти здесь, в stackru - я исключен:-)).

Полное руководство и список книг C

В этом списке вы найдете книги более высокого качества.

Помимо этого long int обычно в большинстве реализаций имеет тот же размер, что и int, 4 байта.

Но, как вы сказали, это предположение, совершенно правильно спрашивать.

Я бы предпочел не использовать geeksforgeeks как источник знаний. На этой странице есть более "неточная" информация

Стандарт C определяет минимальные диапазоны целочисленных типов

— 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 // −(2 7 − 1)
— maximum value for an object of type signed char
SCHAR_MAX +127 // 2 7 − 1
— maximum value for an object of type unsigned char
UCHAR_MAX 255 // 2 8 − 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 // −(2 15 − 1)
— maximum value for an object of type short int
SHRT_MAX +32767 // 2 15 − 1
— maximum value for an object of type unsigned short int
USHRT_MAX 65535 // 2 16 − 1
— minimum value for an object of type int
INT_MIN -32767 // −(2 15 − 1)
— maximum value for an object of type int
INT_MAX +32767 // 2 15 − 1
— maximum value for an object of type unsigned int
UINT_MAX 65535 // 2 16 − 1
— minimum value for an object of type long int
LONG_MIN -2147483647 // −(2 31 − 1)
— maximum value for an object of type long int
LONG_MAX +2147483647 // 2 31 − 1
— maximum value for an object of type unsigned long int
ULONG_MAX 4294967295 // 2 32 − 1
22 Environment §5.2.4.2.1
WG14/N1256 Committee Draft — Septermber 7, 2007 ISO/IEC 9899:TC3
— minimum value for an object of type long long int
LLONG_MIN -9223372036854775807 // −(2 63 − 1)
— maximum value for an object of type long long int
LLONG_MAX +9223372036854775807 // 2 63 − 1
— maximum value for an object of type unsigned long long int
ULLONG_MAX 18446744073709551615 // 2 64 − 1

Таким образом, целое число - это не минимум 32 бита, а 16 бит. Фактический размер можно проверить вlimits.h определяет (это происходит из стандарта C):

#define CHAR_BIT 8
#define CHAR_MAX UCHAR_MAX or SCHAR_MAX
#define CHAR_MIN 0 or SCHAR_MIN
#define INT_MAX +32767
#define INT_MIN -32767
#define LONG_MAX +2147483647
#define LONG_MIN -2147483647
#define LLONG_MAX +9223372036854775807
#define LLONG_MIN -9223372036854775807
#define MB_LEN_MAX 1
#define SCHAR_MAX +127
#define SCHAR_MIN -127
#define SHRT_MAX +32767
#define SHRT_MIN -32767
#define UCHAR_MAX 255
#define USHRT_MAX 65535
#define UINT_MAX 65535
#define ULONG_MAX 4294967295
#define ULLONG_MAX 18446744073709551615

Стандарт C также устанавливает минимальный диапазон типов с плавающей запятой, но вам нужно проверить свой .h файл для значений реализации.

#define DBL_DIG 10
#define DBL_MANT_DIG
#define DBL_MAX_10_EXP +37
#define DBL_MAX_EXP
#define DBL_MIN_10_EXP -37
#define DBL_MIN_EXP
#define DECIMAL_DIG 10
#define FLT_DIG 6
#define FLT_MANT_DIG
#define FLT_MAX_10_EXP +37
#define FLT_MAX_EXP
#define FLT_MIN_10_EXP -37
#define FLT_MIN_EXP
#define FLT_RADIX 2
#define LDBL_DIG 10
#define LDBL_MANT_DIG
#define LDBL_MAX_10_EXP +37
#define LDBL_MAX_EXP
#define LDBL_MIN_10_EXP -37
#define LDBL_MIN_EXP

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

#define DBL_MAX 1E+37
#define FLT_MAX 1E+37
#define LDBL_MAX 1E+37

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

#define DBL_EPSILON 1E-9
#define DBL_MIN 1E-37
#define FLT_EPSILON 1E-5
#define FLT_MIN 1E-37
#define LDBL_EPSILON 1E-9
#define LDBL_MIN 1E-37

если мы предполагаем, что long int занимает 8 байтов (64 бита), тогда его диапазон должен быть от -2^63 до 2^63-1, но это не указано в ссылке выше. почему это так?

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

Стандарт дает вам <limits.h> который будет содержать пределы long int на данной платформе, LONG_MAX а также LONG_MIN, и единственная гарантия, которую вам дадут, состоит в том, что любое значение будет не меньше, чем 2147483647 (2^32-1) соответственно.

Хорошая идея - не делать предположений о специфике платформы и поддерживать переносимость кода таким образом.

На самом деле нет диапазона, который можно было бы указать для float, double а также long double, поскольку это числа с плавающей запятой. Хотя расстояние между целыми числами всегда равно 1, существуют разные расстояния между отдельными числами для чисел с плавающей запятой (расстояние увеличивается с увеличением числа), и, следовательно, также наименьшее представимое число с точки зрения количества:

  • float-32-битное значение, включающее 23 мантиссы, 8-битную экспоненту и 1 знаковый бит. Минимальное значение здесь -3,40∙10³⁸, а максимальное 3,40∙10³⁸. Наименьшее представимое значение в сумме составляет 1,18∙10⁻³⁸.
  • doubleпредставляет собой 64-битное значение, включающее 52 мантиссы, 11 -битную экспоненту и 1 знаковый бит. Минимальное значение здесь составляет 1,79∙10³, а максимальное - 1,79∙10³⁰⁸. Наименьшее представимое значение в сумме составляет 2,23∙10⁻³⁸.
  • long doubleпредставляет собой 80-битное значение, включающее 64 мантиссу, 15-битную экспоненту и 1 знаковый бит. Минимальное значение здесь составляет -1,18∙10⁴⁹³², а максимальное - 1,18∙10⁴⁹³². Наименьшее представимое значение в сумме составляет 3,37∙10⁻⁴⁹³².

Приложение: значения также зависят от платформы, значения выше применимы к платформе x86. Под рукой нет 80-битного типа с плавающей запятой.


Ссылки:

Другие вопросы по тегам