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-битного типа с плавающей запятой.
Ссылки:
- Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32
Том 1 - Глава 4: Типы данных, применимые к стандарту IEEE 754