C中数据类型的最大值

时间:2014-11-02 04:59:34

标签: c++ c

我试图理解我可以存储在C中的最大值。我尝试做printf("%f",pow(2,x))。答案是有效的,直到x = 1023.它表示当x = 1024时的Inf。

我很抱歉这是一个基本问题,但我想了解C如何分配数据类型'尺寸基于我的机器。

我有一台Mac(64位处理器)。我清楚地了解到我的处理器是64位处理器,它能够进行高达2 ^ 64的计算。显然,pow(2,1023)大于此。但我的程序工作正常,直到x = 1023.这怎么可能? GNU编译器是否与此有关?

如果这是其他问题的重复,请给出链接。提前谢谢。

3 个答案:

答案 0 :(得分:4)

在C中,pow()函数返回doubledouble类型通常是浮点数字的64位IEEE格式表示。

浮点的基本思想是以与例如一般的方式表达数字。 1.234×10 56 。这里有尾数 1.234和指数 56. C ++,也可能是C,允许浮点数的十进制表示(但不适用于整数类型),但在实践中内部表示将是二进制的,功率为2而不是10的幂。

您遇到的限制是编译器表示double个数字时指数的支持范围;可能是64位 IEEE 754


各种内置整数数字类型的限制可用作<limits.h>的符号常量。内置浮点类型的限制可用作<float.h>的符号常量。有关详细信息,请参阅cppreference.com上的表格。

在C ++中,这些限制也可以通过numeric_limits中的<limits>类模板获得。

答案 1 :(得分:3)

64位处理器通常意味着它可以处理最多64位的数字,而不是它只能处理64位或更少的数字。如果您有足够的RAM(和时间),使用arbitrary precision arithmetic可以对任意大的数字进行计算。在此处阅读更多内容:What is the biggest number you can generate using a 64 bit processor?

pow(2, 1023)返回一个带有符号的浮点数,一个尾数和一个像(-1)^sgn(2^1023)*1*2^1023这样的指数。它不会存储所有数字,因此它只能精确到前几位数。然而,大多数系统使用二进制浮点类型,因此对于二进制,它可以存储2的幂的精确值,直到大的功率,具体取决于指数范围。大多数情况下,浮点类型符合IEEE 754标准,因此您可以找到最大值here

您还可以找到不同类型here的最大值的常量。

答案 2 :(得分:1)

double的最大值为DBL_MAX。这在C中是defined by <float.h>,在C ++中是<cfloat>。数值可能因系统而异,但您始终可以通过宏DBL_MAX引用它。

你可以打印这个:

printf("%f\n", DBL_MAX);

整数数据类型都具有<limits.h>中定义的类似宏:例如ULLONG_MAXunsigned long long的最大价值。如果使用printf进行打印,请确保使用正确的格式说明符。