C编程中的长int范围



根据链接https://www.geeksforgeeks.org/data-types-in-c/2

如果我们假设long int占用8个字节(64位(,那么它的范围应该是-2^63到2^63-1,但上面的链接中没有给出。为什么会这样?

类似地,unsigned long int的范围应该在0到2^64之间。

请告诉floatdoublelong double的范围是多少,因为链接中没有提到。

如果我们假设long int占用8个字节(64位(,那么它的范围应该是-2^632^63-1,但上面的链接中没有给出。为什么会这样?

因为GeeksForGeeks是错误和虚假的已知来源。不要相信他们。信任官方标准和拥有数十年经验的知名作者(正如你在Stack Overflow上看到的那样——我除外:-(。

最终C书籍指南和列表

在这份清单下你可以找到质量更高的书。

除此之外,long int在大多数实现中通常具有与int相同的大小,4字节。

但正如你所说,这是一个假设,要求完全正确。

我宁愿不使用极客作为知识的来源。还有更多的";不精确的";此页面上的信息

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

如果我们假设长int占用8个字节(64位(,那么它的范围应该是-2^63到2^63-1,但上面的链接中没有给出。为什么会这样?

因为C的指定方式允许为那些遵循您的任何一个假设的平台创建完全一致的实现——long int占用8个字节,并且该值以2的补码编码。

该标准为您提供了<limits.h>,它将包含给定平台上long int的极限LONG_MAXLONG_MIN,并且您得到的唯一保证是,这两个值的大小分别不小于2147483647(2^32-1(。

最好不要对平台细节做出假设,并以这种方式保持代码的可移植性。

由于floatdoublelong double都是浮点数,因此实际上无法指定范围。虽然整数之间的距离总是1,但浮点数的单个数字之间存在不同的距离(距离随着数字的增加而增加(,因此也是数量方面最小的可表示数字:

  • float是一个32位值,包括23尾数、8位指数和1个符号位。此处的最小值为-3.40∙10³⁸最大3.40∙10³⁸.可代表的最小金额为1.18∙10⁻³⁸.
  • double是包括52尾数、11比特指数和1符号比特的64比特值。此处的最小值为1.79∙10³⁰⁸最大1.79∙10³⁰⁸.金额上可代表的最小值为2.23∙10⁻³⁸.
  • long double是包括64尾数、15位指数和1个符号位的80位值。此处的最小值为-1.18∙10⁴⁹³²和最大1.18∙10⁴⁹³²。金额上可代表的最小值为3.37∙10⁻⁴⁹³²

附录:这些值也取决于平台,上面的值适用于x86平台。臂下没有80位浮点型。


参考文献:

  • 英特尔®;64与IA-32体系结构软件开发人员手册
    第1卷-第4章:适用于IEEE标准754的数据类型

最新更新