gcc中的long double问题4.6.1(linux)

时间:2012-06-06 03:37:15

标签: c gcc type-conversion mint

#include <stdio.h>

int main()
{
    long double n = (long double)1208925819614629174706175; // (1<<80)-1 (generated in python)
    printf("%LG\n",n);
}

在用gcc编译时,我收到警告

test.c:5:31: warning: integer constant is too large for its type [enabled by default]

运行时会打印-1

在执行sizeof(long double)时,会打印12。  那么签名的long double应该适应(1 <&lt;&lt;&lt; 83)-1 吧?

如何让它正常工作?

PS:我正在研究的原始问题,处理存储的有符号整数,大小为 12 *(10 18 )。我不想写乘法,加法和其他计算例程。那我该怎么做呢?

2 个答案:

答案 0 :(得分:2)

Long double将处理10 ** 300及以上,这不是编译器所抱怨的。它表示您尝试强制转换为long的整数对于整数来说太大了。 (提示 - 添加小数点) - starbolin

答案 1 :(得分:2)

Starbolin是正确的,但我认为需要对此表达式进行详细解释:

在C中,数字常量(不带小数点)的类型为intlong,具体取决于值。
你使用的常量1208925819614629174706175long来说太大了,所以它被截断了。
所有这些都在转换为long double并分配给n之前发生 当浮点类型进入图片时,数字常量已被截断,丢失的位不能返回。

这是因为C是一种简单的语言,它遵循编译过程中简单定义的步骤。编译器没有“向前看”以查看将数字常量强制转换为long double。它首先将其视为long,然后继续。