根据链接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
提到。
根据链接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
提到。
我宁愿不使用 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>
上将包含 的限制和,并且您得到的唯一保证是任一值的幅度分别不小于(2^32-1)。long int
LONG_MAX
LONG_MIN
2147483647
最好不要对平台细节做出假设,并以这种方式保持代码的可移植性。
如果我们假设
long int
需要 8 个字节(64 位),那么它的范围应该是-2^63
to2^63-1
,但是上面的链接中没有给出。为什么会这样?
因为GeeksForGeeks是不正确和错误的已知来源。不要相信他们。相信官方标准和拥有数十年经验的知名作者(您可以在 Stack Overflow 上找到 - 我不包括 :-))。
在此列表下,您可以找到质量更高的书籍。
除此之外,long int
在大多数实现中,它的大小通常与int
4 字节相同。
但正如你所说,这是一个假设,要求是完全正确的。
实际上并没有可以为和指定的范围float
,因为它们是浮点数。虽然整数之间的距离始终为 1,但浮点数的各个数字之间的距离不同(距离随着数字的增大而增加),因此在数量方面也是最小的可表示数字:double
long double
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平台。arm下没有 80 位浮点类型。
参考: